我有下面的数据框,我想要另一个列显示非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
的方法:
- 使用
pandas.DataFrame.idxmax
与axis = 1
(列)
>>> df["New Column"] = df.idxmax(1)
- 使用
numpy.where
和pandas.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
您可以使用idxmax
和skipna=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)