聚合python数据帧中的行

聚合python数据帧中的行,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框架,记录了产品从篮子中添加和删除的时间。但是,set\u name列包含颜色集和形状集的两组信息。见下文: eff_date prod_id set_name change_type 0 20150414 20770 MONO COLOR SET ADD 1 20150414 20770 REC SHAPE SET ADD 2 20150429 132

我有一个数据框架,记录了产品从篮子中添加和删除的时间。但是,
set\u name
列包含颜色集和形状集的两组信息。见下文:

   eff_date  prod_id   set_name         change_type           
0  20150414  20770     MONO COLOR SET   ADD             
1  20150414  20770     REC SHAPE SET    ADD         
2  20150429  132       MONO COLOR SET   ADD                
3  20150429  132       REC SHAPE SET    ADD        
4  20150521  199       MONO COLOR SET   DROP
5  20150521  199       REC SHAPE SET    DROP
6  20150521  199       TET SHAPE SET    ADD
7  20150521  199       MONO COLOR SET   ADD
我想将
set\u name
中包含的两组信息分为
color\u set
shape\u set
列,然后删除
set\u name
。因此,前面的df应该如下所示:

   eff_date  prod_id   change_type  color_set       shape_set     
0  20150414  20770     ADD          MONO COLOR SET  REC SHAPE SET          
1  20150429  132       ADD          MONO COLOR SET  REC SHAPE SET
2  20150521  199       DROP         MONO COLOR SET  REC SHAPE SET
3  20150521  199       ADD          MONO COLOR SET  TET SHAPE SET
我尝试先在for循环中拆分列,然后使用groupby进行聚合:

for index, row in df.iterrows():
    if 'COLOR' in df.loc[index,'set_name']:
        df.loc[index,'color_set'] = df.loc[index,'set_name']
    if 'SHAPE' in df.loc[index,'set_name']:
        df.loc[index,'shape_set'] = df.loc[index,'set_name']
df = df.fillna('')
df.groupby(['eff_date','prod_id','change_type']).agg({'color_set':sum,'shape_set':sum})
然而,这给我留下了一个只有两列的数据帧和多级索引,我不知道如何取消堆栈

                                color_set       shape_set
eff_date  prod_id  change_type 
20150414  20770    ADD          MONO COLOR SET  REC SHAPE SET
20150429  132      ADD          MONO COLOR SET  REC SHAPE SET
20150521  199      DROP         MONO COLOR SET  REC SHAPE SET
                   ADD          MONO COLOR SET  TET SHAPE SET

非常感谢您在这方面的任何帮助

除了必须重置索引之外,您的代码看起来还不错,但是我们可以将其简化很多(特别是不需要
iterrows
,这可能会非常慢,使用
pivot
和一个小技巧来获取列名

此答案假设您的列中只有这两个选项,如果您有更多类别,只需使用
numpy。选择
而不是
numpy。其中
并以这种方式定义您的条件/输出



df.reset_index()同样,请提供df.to_dict()的输出。
@ifly6谢谢!!有一段时间我完全忘记了这个函数的存在
df['key'] = np.where(df['set_name'].str.contains('COLOR'), 'color_set', 'shape_set')

df.pivot_table(
  index=['eff_date', 'prod_id', 'change_type'],
  columns='key',
  values='set_name',
  aggfunc='first'
).reset_index()
key  eff_date  prod_id change_type       color_set      shape_set
0    20150414    20770         ADD  MONO COLOR SET  REC SHAPE SET
1    20150429      132         ADD  MONO COLOR SET  REC SHAPE SET
2    20150521      199         ADD  MONO COLOR SET  TET SHAPE SET
3    20150521      199        DROP  MONO COLOR SET  REC SHAPE SET