Skip to main content
 首页 » 编程设计

python之将虚拟值列合并为一列(pd.get_dummies 反转)

2025年05月04日15qq78292959

我有一个像这样的 Pandas DataFrame :

id     Apple   Apricot   Banana    Climentine   Orange    Pear    Pineapple 
01       1        1         0          0          0         0         0     
02       0        0         1          1          1         1         0  
03       0        0         0          0          1         0         1 

如何生成这样的新 DataFrame?

id     fruits 
01     Apple, Apricot 
02     Banana, Clementine, Orange, Pear 
03     Orange, Pineapple 

请您参考如下方法:

使用melt , 过滤 1 和每个组的最后一个加入值 ,:

df = pd.DataFrame({ 
    'id': ['01','02','03'], 
    'Apple': [1,0,0], 
    'Apricot': [1,0,0], 
    'Banana': [0,1,0], 
    'Climentine': [0,1,0], 
    'Orange': [0,1,1], 
    'Pear': [0,1,0], 
    'Pineapple': [0,0,1] 
}) 
 
df = (df.melt('id', var_name='fruits').query('value == 1') 
       .groupby('id')['fruits'] 
       .apply(', '.join) 
       .reset_index()) 
 
print (df) 
 
#   id                            fruits 
#0   1                    Apple, Apricot 
#1   2  Banana, Climentine, Orange, Pear 
#2   3                 Orange, Pineapple 

为了更好的性能,使用点进行矩阵乘法:

df = df.set_index('id') 
df = df.dot(df.columns + ', ').str.rstrip(', ').reset_index(name='fruit') 
print (df) 
   id                             fruit 
0  01                    Apple, Apricot 
1  02  Banana, Climentine, Orange, Pear 
2  03                 Orange, Pineapple