获取非 NaN 值的列名作为新列

时间:2021-03-03 11:25:28

标签: python pandas dataframe nan

我有下面的数据框,我想要另一列显示非 NaN 值的列名。 像这样:

New Column
y32
y9
y11
y9

等等。

          y9        y2       y11       y32
1        NaN       NaN       NaN  0.201229
2   0.053303       NaN       NaN       NaN
4        NaN       NaN  0.442415       NaN
6   0.000529       NaN       NaN       NaN

我尝试用 for 循环来完成,但无法完成。 非常感谢帮助。

2 个答案:

答案 0 :(得分:1)

这里有几种不使用 pandas.DataFrame.apply 的方法:

  1. pandas.DataFrame.idxmaxaxis = 1(列)一起使用
>>> df["New Column"] = df.idxmax(1)
  1. 使用 numpy.wherepandas.DataFrame.notna
>>> df["New Column"] = df.columns[np.where(df.notna())[1]]

在这两种情况下,结果数据框都是:

         y9  y2       y11       y32 New Column
1       NaN NaN       NaN  0.201229        y32
2  0.053303 NaN       NaN       NaN         y9
4       NaN NaN  0.442415       NaN        y11
6  0.000529 NaN       NaN       NaN         y9

答案 1 :(得分:0)

您可以将 idxmaxskipna=True 一起使用并将其应用于每一行:

def f(r):
     return r.idxmax(skipna=True)

df['New Column'] = df.apply(f, axis=1)

或者单线:

df['New Column'] = df.apply(lambda r: r.idxmax(skipna=True), axis=1)

更新:

更好的方法是使用 Series.first_valid_index():

df['New Column'] = df.apply(pd.Series.first_valid_index, axis=1)
相关问题