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("'")

然后 groupbyapply,最后如果需要 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']]}