use*_*567 5 python dataframe pandas
我有一个onehot编码的列,df用零表示为“ nan”。我正在尝试将onehot编码的列转换为单个列。
假设以下数据框df
p1 | p2 | p3 | p4 | p5 |
---------------------------------------
0 cat nan nan nan nan
1 nan dog nan nan nan
2 nan nan horse nan nan
3 nan nan nan donkey nan
4 nan nan nan nan pig
Run Code Online (Sandbox Code Playgroud)
所需输出
animals
-----------------
0 cat
1 dog
2 horse
3 donkey
4 pig
Run Code Online (Sandbox Code Playgroud)
如果每行总是只有一个非缺失值,请使用前向填充缺失值(如DataFrame.fillnawith method='ffill'),然后按位置选择最后一列 with DataFrame.iloc,也为一列DataFrame添加Series.to_frame:
df = df.ffill(axis=1).iloc[:, -1].to_frame('new')
print (df)
new
0 cat
1 dog
2 horse
3 donkey
4 pig
Run Code Online (Sandbox Code Playgroud)
如果可能,每行使用更多的非缺失值DataFrame.stack与join每个第一级:
print (df)
p1 p2 p3 p4 p5
0 cat NaN NaN NaN lion
1 NaN dog NaN NaN NaN
2 NaN NaN horse NaN NaN
3 NaN NaN NaN donkey NaN
4 NaN NaN NaN NaN pig
df2 = df.stack().groupby(level=0).apply(', '.join).to_frame('new')
print (df2)
new
0 cat, lion
1 dog
2 horse
3 donkey
4 pig
Run Code Online (Sandbox Code Playgroud)
或 lambda 函数:
df2 = df.apply(lambda x: x.dropna().str.cat(sep=', '), axis=1).to_frame('new')
print (df2)
new
0 cat, lion
1 dog
2 horse
3 donkey
4 pig
Run Code Online (Sandbox Code Playgroud)