我有这样的df:
ID Cluster Product
1 4 'b'
1 4 'f'
1 4 'w'
2 7 'u'
2 7 'b'
3 5 'h'
3 5 'f'
3 5 'm'
3 5 'd'
4 7 's'
4 7 'b'
4 7 'g'
其中ID是另一个df的主键和唯一键,它是此df的源。群集不是关键,不同的ID通常具有相同的群集值;无论如何,这是我必须要继续的信息。
我想要获得的是这个数据帧:
ID Cluster Product_List_by_ID
1 4 ['b','f','w']
2 7 ['u','b']
3 5 ['h','f','m','d']
4 7 ['s','b','g']
如果无法做到这一点,那么这样的字典也可以没问题:
d = {ID:[1,2,3,4], Cluster:[4,7,5,7],
Product_List_by_ID:[['b','f','w'],['u','b'],['h','f','m','d'],['s','b','g']]}
我尝试了许多方法失败了......似乎无法将列表作为pandas数据帧值插入.. 无论如何,我认为以一些棘手的方式获得目标应该不会那么困难。抱歉,如果我不在乎,但我是新手编码
有什么建议吗?!感谢
答案 0 :(得分:6)
使用groupby
df.groupby(['ID', 'Cluster']).Product.apply(list)
ID Cluster
1 4 ['b', 'f', 'w']
2 7 ['u', 'b']
3 5 ['h', 'f', 'm', 'd']
4 7 ['s', 'b', 'g']
Name: Product, dtype: object
答案 1 :(得分:2)
另一种解决方案是首先从str.strip
{}删除'
列Product
:
df.Product = df.Product.str.strip("'")
然后groupby
与apply
一起,如果需要dictionary
则使用带有参数orient='list'
的{{3}}
print (df.groupby(['ID', 'Cluster'])
.Product.apply(lambda x: x.tolist())
.reset_index()
.to_dict(orient='list'))
{'Cluster': [4, 7, 5, 7],
'ID': [1, 2, 3, 4],
'Product': [['b', 'f', 'w'], ['u', 'b'],
['h', 'f', 'm', 'd'], ['s', 'b', 'g']]}