我有一个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
必需的输出
animals
-----------------
0 cat
1 dog
2 horse
3 donkey
4 pig
答案 0 :(得分:6)
如果每行始终只有一个非缺失值,则使用前向填充缺失值(例如DataFrame.fillna
和method='ffill'
),然后按位置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
如果可能的话,每行更多的非缺失值请在第一级使用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
或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
答案 1 :(得分:0)
如果每行只有一个单词,则可以用空字符串填充NaN
并逐行求和:
df.fillna('').sum(axis=1)
结果:
0 cat
1 dog
2 horse
3 donkey
4 pig
dtype: object
答案 2 :(得分:0)
傻,但可以。如果同一索引的> NA不是> 1,则不确定您的期望。
df['animals'] = df[df.columns[0]]
for c in df.columns[1:]:
df['animals'].fillna(df[c], inplace=True)