将 pandas GroupBy 中的列值聚合为 dict

Posted

技术标签:

【中文标题】将 pandas GroupBy 中的列值聚合为 dict【英文标题】:Aggregate column values in pandas GroupBy as a dict 【发布时间】:2017-12-25 10:48:17 【问题描述】:

这是我在过去的采访中提出的问题。

我们的输入数据具有以下列:

语言、产品 ID、货架 ID、排名

例如,输入将具有以下格式

English, 742005, 4560, 10.2 
English, 6000075389352, 4560, 49
French, 899883993, 4560, 32
French, 731317391, 7868, 81

我们想对语言、货架 id 列进行“分组”操作,并根据“rank”属性的排序说明对产品列表进行排序,这将导致输出具有以下格式:

语言,shelf_id,product_id:rank1, product_id:rank2 ....

对于每条记录。

对于给定的输入,输出如下:

English, 4560, 6000075389352:49, 742005:10.2
French, 4560, 899883993:32
French, 7868, 731317391:81

我通过使用键(通过组合语言和货架 id 创建)并插入产品 id 并为每个键排名来解决这个问题。

我的方法有效,但使用 python pandas 库似乎有一种更简单的方法。我已经阅读了一些参考资料,但我仍然不确定是否有比我所做的更好的方法(通过使用具有该密钥的语言、货架 ID 和字典创建密钥来解决问题)

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

设置

df = pd.read_csv('file.csv', header=None)  
df.columns = ['Lang', 'product_id', 'shelf_id', 'rank_id']    

df
      Lang     product_id  shelf_id  rank_id
0  English         742005      4560     10.2
1  English  6000075389352      4560     49.0
2   French      899883993      4560     32.0
3   French      731317391      7868     81.0

您可以使用df.groupbyLangshelf_id 分组。然后使用df.apply得到productid : rankid的字典:

(df.groupby(['Lang', 'shelf_id'], as_index=False)
   .apply(lambda x: dict(zip(x['product_id'], x['rank_id'])))
   .reset_index(name='mapping'))

      Lang  shelf_id                              mapping
0  English      4560  6000075389352: 49.0, 742005: 10.2
1   French      4560                    899883993: 32.0
2   French      7868                    731317391: 81.0

【讨论】:

感谢您的回答,但您能否解释一下您是如何将文本输入作为数据框读取的? @user98235 使用设置信息编辑了我的帖子。我假设您的数据在 csv 文件中。 @COLDSPEED 感谢您的回答,但您能否告诉我,如果您只是将其作为输入文件呢?例如,我可以直接输入。 @user98235 如果您不想从文件中读取,此链接可能对您有用:***.com/a/22605281/4909087

以上是关于将 pandas GroupBy 中的列值聚合为 dict的主要内容,如果未能解决你的问题,请参考以下文章

Pandas groupby 和聚合输出应包括所有原始列(包括未聚合的列)

在groupby之后访问pandas中的分层列

数据分析—Pandas 中的分组聚合Groupby 高阶操作

pandas聚合和分组运算之groupby

为 pandas groupby 中的不同特征分配不同的聚合函数

Python Pandas 如何将 groupby 操作结果分配回父数据框中的列?