将pandas GroupBy中的列值汇总为dict

时间:2017-07-19 23:46:44

标签: python pandas dictionary dataframe group-by

这是我过去在采访中遇到的问题。

我们的输入数据包含以下列:

语言,产品ID,货架ID,等级

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

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

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

语言,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 个答案:

答案 0 :(得分:2)

<强>设置

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}