Python,在一列中合并具有相同值的行

时间:2017-08-28 12:03:38

标签: python pandas

我的数据框如下所示:

     ID         Class
      0           9
      1           8
      1           6
      2           6
      2           2
      3           15
      3           1
      3           8

我想要做的是以下面的方式合并具有相同ID值的行:

    ID       Class1 Class2 Class3
    0           9
    1           8      6
    2           6      2
    3           15     1      8

因此,对于每个存在多次的ID,我想创建新列并将值从行移动到这些列。最快的方法是什么?我尝试使用groupby,但它没有给我适当的结果。

2 个答案:

答案 0 :(得分:2)

set_indexcumcount一起用于新列,按unstack重新整形,最后按add_prefix重命名列:

df = df.set_index(['ID', df.groupby('ID').cumcount()])['Class']
       .unstack()
       .add_prefix('Class')
       .reset_index()

print (df)
   ID  Class0  Class1  Class2
0   0     9.0     NaN     NaN
1   1     8.0     6.0     NaN
2   2     6.0     2.0     NaN
3   3    15.0     1.0     8.0

另一个解决方案是每个组创建list,然后按构造函数创建新的DataFrame

s = df.groupby('ID')['Class'].apply(list)
df = pd.DataFrame(s.values.tolist(), index=s.index)
       .add_prefix('Class')
       .reset_index()
print (df)
   ID  Class0  Class1  Class2
0   0       9     NaN     NaN
1   1       8     6.0     NaN
2   2       6     2.0     NaN
3   3      15     1.0     8.0

编辑:

df = df.set_index('ID')
df1=pd.get_dummies(df['Class']).reindex(columns=range(17), fill_value=0).add_prefix('Class')
df1 = df1.groupby(level=0).max().reset_index()
print (df1)
   ID  Class0  Class1  Class2  Class3  Class4  Class5  Class6  Class7  Class8  \
0   0       0       0       0       0       0       0       0       0       0   
1   1       0       0       0       0       0       0       1       0       1   
2   2       0       0       1       0       0       0       1       0       0   
3   3       0       1       0       0       0       0       0       0       1   

   Class9  Class10  Class11  Class12  Class13  Class14  Class15  Class16  
0       1        0        0        0        0        0        0        0  
1       0        0        0        0        0        0        0        0  
2       0        0        0        0        0        0        0        0  
3       0        0        0        0        0        0        1        0  

答案 1 :(得分:0)

或者你可以尝试

df.groupby('ID').Class.apply(lambda x : x.tolist()).to_frame()['Class'].apply(pd.Series).add_prefix('Class_').fillna(' ')
Out[602]: 
    Class_0 Class_1 Class_2
ID                         
0       9.0                
1       8.0       6        
2       6.0       2        
3      15.0       1       8