Python,合并一列中具有相同值的行 [英] Python, Merging rows with same value in one column

查看:401
本文介绍了Python,合并一列中具有相同值的行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的数据框如下所示:

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

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

What I would like to do is merging rows with same ID value in a way below:

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

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

So for each ID which exists more than once, I want to create new column(s) and move values from rows to those columns. What is the fastest way to do this? I tried using groupby but it didn't give me appriopate results.

推荐答案

使用 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:

Another solution is create list per groups and then new DataFrame by constructor:

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  

这篇关于Python,合并一列中具有相同值的行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆