如何将多列转换为单列?

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)

jez*_*ael 6

如果每行总是只有一个非缺失值,请使用前向填充缺失值(如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.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
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)