熊猫:取任何不是NaN的列

hel*_*loB 6 python pandas

我正在处理一个相当混乱的数据集,这些数据集是个别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)

我怎么能做到这一点?

max*_*moo 5

如果您只有 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)


Ale*_*der 5

对于具有任意列数的数据帧,您可以回填行(.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)