获取非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循环来做,但不能完全做到。非常感谢你的帮助。

这里有几个不使用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

您可以使用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)

最新更新