分组后的动态列

时间:2019-08-05 04:49:43

标签: python pandas-groupby

请帮助解决下一个问题:

我有一个df

df = pd.DataFrame({'Contract': ['contract1', 'contract1', 'contract1', 'contract2',
                     'contract2', 'contract3', 'contract3', 'contract3'],
               'Customer': ['Bob', 'Jane', 'Ashley', 'Bill',
                     'John', 'Harry', 'Holley', 'Bob'],
               'Customer_id': ['id0001', 'id0002', 'id0003', 'id0004',
                     'id0005', 'id0006', 'id0007', 'id0001'],
                })

输出为

enter image description here

我的目标是获得如下所示的结果

enter image description here

我认为我应该在迭代时使用某种函数,但另一方面,我有一种解决它的简单方法。

在这两种情况下,我都不知道从哪里开始,请帮忙,因为我只是开始学习使用Python。

我要做的第二项任务是在另一个表中看到group1和group2也已链接,因为Bob是两个组中的客户。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您的问题是关于按合同分组。
让我们将“合同”列重命名为“组”,并相应地替换其元素。

df.rename({'Contract':'Group'},axis=1, inplace=True)
df['Group'] = df.Group.apply(lambda x : x.replace('contract', 'group'))
df

Customer分组,并应用lambda函数,它将每个组的成员连接在一起(逗号分隔)。

dfa = df.groupby('Group')['Customer'].apply(lambda x: ", ".join(x))

dfa看起来像这样:

Group
group1     Bob, Jane, Ashley
group2            Bill, John
group3    Harry, Holley, Bob

Customer_id分组,将它们组合在一起(以逗号分隔),然后再次将其拆分,然后转换为熊猫系列。

# note:  there's probably a cleaner way to do this, but this came first to mind
dfb = df.groupby('Group')['Customer_id']\
    .apply(lambda x: ",".join(x))\
    .apply(lambda x : x.split(','))\
    .apply(pd.Series)
dfb.columns = ['Customer_id{}'.format(i) for i in dfb.columns]

dfb看起来像这样:

       Customer_id0 Customer_id1 Customer_id2
Group                                        
group1       id0001       id0002       id0003
group2       id0004       id0005          NaN
group3       id0006       id0007       id0001

最后,您想将它们合并在一起。

dfc = dfb.merge(dfa, left_index=True, right_index=True)

最终结果dfc如下所示:

       Customer_id0 Customer_id1 Customer_id2            Customer
Group                                                            
group1       id0001       id0002       id0003   Bob, Jane, Ashley
group2       id0004       id0005          NaN          Bill, John
group3       id0006       id0007       id0001  Harry, Holley, Bob