在python中取第一个非null

Mat*_* W. 7 python dataframe pandas

我正在尝试从数据帧中的多个pandas系列中获取第一个非null值.

df = pd.DataFrame({'a':[2, np.nan, np.nan, np.nan],
              'b':[np.nan, 5, np.nan, np.nan],
              'c':[np.nan, 55, 13, 14],
              'd':[np.nan, np.nan, np.nan, 4],
              'e':[12, np.nan, np.nan, 22],
          })

     a    b     c    d     e
0  2.0  NaN   NaN  NaN  12.0
1  NaN  5.0  55.0  NaN   NaN
2  NaN  NaN  13.0  NaN   NaN
3  NaN  NaN  14.0  4.0  22.0
Run Code Online (Sandbox Code Playgroud)

在这里df我想创建一个新列'f',并将其设置为'a'如果a不为null,'b'如果b不为null等等.

我可以做一堆效率低下的np.where语句.

df['f'] = np.where(df.a.notnull(), df.a,
              np.where(df.b.notnull(), df.b,
                   etc.))
Run Code Online (Sandbox Code Playgroud)

我调查df.a or df.b or df.c等等

结果应该是这样的:

     a    b     c    d     e   f
0  2.0  NaN   NaN  NaN  12.0   2
1  NaN  5.0  55.0  NaN   NaN   5
2  NaN  NaN  13.0  NaN   NaN  13
3  NaN  NaN  14.0  4.0  22.0  14
Run Code Online (Sandbox Code Playgroud)

WeN*_*Ben 9

一个解决方案

df.groupby(['f']*df.shape[1], axis=1).first()
Out[385]: 
      f
0   2.0
1   5.0
2  13.0
3  14.0
Run Code Online (Sandbox Code Playgroud)

其他

df.bfill(1)['a']
Out[388]: 
0     2.0
1     5.0
2    13.0
3    14.0
Name: a, dtype: float64
Run Code Online (Sandbox Code Playgroud)