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

然后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']]

【讨论】:

很好:现在也解释了我想知道的第二种方式!无论如何,我不知道为什么这个 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 操作:如果其他列行重复,则带有值列表的新列 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

pandas数据处理

如果一个列值与第二个 df 列值匹配,我有两个数据框过滤 onmatch 列行

合并 Pandas Dataframe:如何添加列和替换值

pandas 数据处理

从存储过程结果中删除重复的列行并连接其他列[重复]

Python数据分析库pandas ------ pandas