Pandas df 操作:如果其他列行重复,则带有值列表的新列 [重复]
Posted
技术标签:
【中文标题】Pandas df 操作:如果其他列行重复,则带有值列表的新列 [重复]【英文标题】:Pandas df manipulation: new column with list of values if other column rows repeated [duplicate] 【发布时间】:2017-05-05 21:09:14 【问题描述】:我有一个这样的 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 不是 key,不同的 ID 通常有相同的 Cluster value;无论如何,这是我必须继续进行的信息。
我想要得到的是这个数据框:
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']]
我尝试了很多方法都没有成功.. 似乎无法将列表作为熊猫数据框值插入.. 无论如何,我认为以某种棘手的方式实现目标应该不难.. 对不起,如果我发疯了,但我是编码新手
有什么建议吗?!谢谢
【问题讨论】:
【参考方案1】:使用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
【讨论】:
groupby之后所有的操作都可以做什么。有什么好的资源吗?groupby
docs
@MohammadYusufGhazi thx... 评论对我来说很困难 :-)
太棒了!我没有想到“.apply(list)”。正是我需要的!
看看我的编辑。我注意到“groupby 系列”的 len 是 17645,而有 17668 个不同的 ID。我确定这些数字,可能 groupby 已删除或者我必须更好地检查我的东西?!谢谢【参考方案2】:
另一个解决方案是首先从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']]
【讨论】:
很好:现在也解释了我想知道的第二种方式!无论如何,我不知道为什么这个 dict[keys] 的 len 是 17645 而 df 有 17668 个不同的 ID .. 是的,我现在考虑一下。数据是保密的吗?你如何测试它们的长度? 您可以通过print (len(df.drop_duplicates(['ID', 'Cluster']).index))
检查长度 - 按第一列和第二列删除重复项,然后检查索引长度。
好的,数据是机密的,我刚刚运行了您的打印删除重复项:result = 17645;而使用 df['ID'].unique() 我知道有 17668 个不同的 ID ..
我看到了问题。你检查的方式不对。因为你需要两列的唯一性,而不是只有一列ID
。以上是关于Pandas df 操作:如果其他列行重复,则带有值列表的新列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章