我正在处理一个相当混乱的数据集,这些数据集是个别csv文件,名称略有不同.重命名csv文件中的列太繁琐了,部分原因是因为我仍在发现所有的变化,所以我希望确定,对于一组列,在给定的行中,哪个字段不是NaN并且携带该向前到一个新专栏.有没有办法做到这一点?
一个很好的例子.假设我有一个如下所示的数据框:
Index A B
1 15 NaN
2 NaN 11
3 NaN 99
4 NaN NaN
5 12 14
Run Code Online (Sandbox Code Playgroud)
假设我想要的输出是创建一个新的列C,这样我的数据框将如下所示:
Index A B C
1 15 NaN 15
2 NaN 11 11
3 NaN 99 99
4 NaN NaN NaN
5 12 14 12 (so giving priority to A over B)
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
如果您只有 2 列,则最简洁的方法是使用where(语法是where([condition], [value if condition is true], [value if condition is false])(出于某种原因,我花了一段时间来解决这个问题)。
In [2]: df.A.where(df.A.notnull(),df.B)
Out[2]:
0 15.0
1 11.0
2 99.0
3 NaN
4 12.0
Name: A, dtype: float64
Run Code Online (Sandbox Code Playgroud)
如果您有两列以上,使用maxor可能更简单min;这将忽略空值,但是您将失去所需的“列优先级”:
In [3]: df.max(axis=1)
Out[3]:
0 15.0
1 11.0
2 99.0
3 NaN
4 14.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)
对于具有任意列数的数据帧,您可以回填行(.bfill(axis=1))并获取第一列(.iloc[:, 0]):
df = pd.DataFrame({
'A': [15, None, None, None, 12],
'B': [None, 11, 99, None, 14],
'C': [10, None, 10, 10, 10]})
df['D'] = df.bfill(axis=1).iloc[:, 0]
>>> df
A B C D
0 15 NaN 10 15
1 NaN 11 NaN 11
2 NaN 99 10 99
3 NaN NaN 10 10
4 12 14 10 12
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
974 次 |
| 最近记录: |