请帮助解决下一个问题:
我有一个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'],
})
输出为
我的目标是获得如下所示的结果
我认为我应该在迭代时使用某种函数,但另一方面,我有一种解决它的简单方法。
在这两种情况下,我都不知道从哪里开始,请帮忙,因为我只是开始学习使用Python。
我要做的第二项任务是在另一个表中看到group1和group2也已链接,因为Bob是两个组中的客户。
感谢您的帮助
答案 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