我有下面的数据框,我想要另一列显示非 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 循环来完成,但无法完成。 非常感谢帮助。
答案 0 :(得分:1)
这里有几种不使用 pandas.DataFrame.apply
的方法:
pandas.DataFrame.idxmax
与 axis = 1
(列)一起使用>>> df["New Column"] = df.idxmax(1)
>>> 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)
您可以将 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)