Pandas df 操作:如果其他列行重复,则包含值列表的新列
Pandas df manipulation: new column with list of values if other column rows repeated
我有一个这样的 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 的主键和唯一键。 Cluster 不是键,不同的 ID 通常具有相同的 Cluster 值;无论如何,这是我必须继续的信息。
我要获取的是这个dataframe:
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 数据框值插入..
无论如何,我认为以某种棘手的方式实现目标应该不是那么困难。抱歉,如果我不在意,但我是编码新手
有什么建议吗?!谢谢
使用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
另一种解决方案是,如有必要,先从 Product
列中删除 '
,方法是 str.strip
:
df.Product = df.Product.str.strip("'")
然后 groupby
和 apply
,最后如果需要 dictionary
使用 to_dict
和参数 orient='list'
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']]}
我有一个这样的 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 的主键和唯一键。 Cluster 不是键,不同的 ID 通常具有相同的 Cluster 值;无论如何,这是我必须继续的信息。
我要获取的是这个dataframe:
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 数据框值插入.. 无论如何,我认为以某种棘手的方式实现目标应该不是那么困难。抱歉,如果我不在意,但我是编码新手
有什么建议吗?!谢谢
使用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
另一种解决方案是,如有必要,先从 Product
列中删除 '
,方法是 str.strip
:
df.Product = df.Product.str.strip("'")
然后 groupby
和 apply
,最后如果需要 dictionary
使用 to_dict
和参数 orient='list'
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']]}