在python中获取第一个非null

时间:2018-08-29 15:08:08

标签: python pandas dataframe

我正在尝试从数据框中的多个熊猫系列中获取第一个非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

在此df中,我想创建一个新列'f',如果a不为空,则将其设置为'a',如果b不为空,则将其设置为'b'降到e。

我可以做一堆效率不高的np.where语句。

df['f'] = np.where(df.a.notnull(), df.a,
              np.where(df.b.notnull(), df.b,
                   etc.))

我考虑做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

3 个答案:

答案 0 :(得分: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

其他

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

答案 1 :(得分:2)

您也可以使用first_valid_index

In [336]: df.apply(lambda x: x.loc[x.first_valid_index()], axis=1)
Out[336]:
0     2.0
1     5.0
2    13.0
3    14.0
dtype: float64

或者,stackgroupby

In [359]: df.stack().groupby(level=0).first()
Out[359]:
0     2.0
1     5.0
2    13.0
3    14.0
dtype: float64

或者,first_valid_index进行查找

In [355]: df.lookup(df.index, df.apply(pd.Series.first_valid_index, axis=1))
Out[355]: array([ 2.,  5., 13., 14.])

答案 2 :(得分:1)

您也可以使用numpy

first_valid = (~np.isnan(df.values)).argmax(1)

然后使用索引:

df.assign(valid=df.values[range(len(first_valid)), first_valid])

     a    b     c    d     e  valid
0  2.0  NaN   NaN  NaN  12.0    2.0
1  NaN  5.0  55.0  NaN   NaN    5.0
2  NaN  NaN  13.0  NaN   NaN   13.0
3  NaN  NaN  14.0  4.0  22.0   14.0