Pandas df操作:如果其他列行重复,则包含值列表的新列

时间:2016-12-20 15:32:05

标签: python pandas dataframe group-by pandas-groupby

我有这样的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数据帧值插入.. 无论如何,我认为以一些棘手的方式获得目标应该不会那么困难。抱歉,如果我不在乎,但我是新手编码

有什么建议吗?!感谢

2 个答案:

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

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