如何将多列转换为单列?

时间:2019-11-28 09:12:52

标签: python pandas dataframe

我有一个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

3 个答案:

答案 0 :(得分:6)

如果每行始终只有一个非缺失值,则使用前向填充缺失值(例如DataFrame.fillnamethod='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.stackjoin

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)