汇总熊猫GroupBy中的多个列值作为dict

及时行乐

我有一个与此问题相关的问题:将pandas GroupBy中的列值聚合为字典

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

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

language, product_id, shelf_id, rank, fiction, pages
English, 742005, 4560, 10.2, 1.0, 456 
English, 6000075389352, 4560, 49, 1.0, 234
French, 899883993, 4560, 32, 0.0, 125
French, 731317391, 7868, 81, 1.0, 576
French, 235678655, 7868, 12, 1.0, 235

我想对language&rack_id列进行“ groupby”操作,并获取每个product_id的剩余属性列表。预期的输出应具有以下格式:

Language, shelf_id, {product_id: [rank, fiction, pages]} 对于每个分组的记录。

对于给定的输入,我的期望的输出将是以下内容:

language, shelf_id, mapping
English, 4560, {742005: [10.2, 1.0, 456], 6000075389352: [49, 1.0, 234]}
French, 4560, {899883993: [32, 0.0, 125]}
French, 7868, {731317391: [81, 1.0, 576], 235678655: [12, 1.0, 235]}

如果仅需要考虑一列(在结果字典中),则上述文章中提供的解决方案可以很好地解决该问题:

df = pd.read_csv('file.csv', header=None)  
df.columns = ['Lang', 'product_id', 'shelf_id', 'rank_id']
(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  {742005: 10.2, 6000075389352: 49.0}
1   French      4560                    {899883993: 32.0}
2   French      7868   {731317391: 81.0, 235678655: 12.0}

谁能帮助我将此解决方案适应我的情况?任何建议,将不胜感激。

Shubham Sharma

想法是创建一个新系列s包含的项目为tuples其中的元组的第一个项目是product_id和第二项是含列的相应值的列表rankfiction并且pages,接下来我们使用Series.groupby到组系列slanguage,并shelf_id和聚集数据字典:

s = pd.Series([(k, v) for k, *v in zip(df['product_id'],
                                       df['rank'], df['fiction'], df['pages'])])
                                       
df = s.groupby([df['language'], df['shelf_id']]).agg(
               lambda d: dict(d.tolist())).reset_index(name='mapping')

细节:

#print(s)
0           (742005, [10.2, 1.0, 456]) # --> product_id: [rank, fiction, pages]
1    (6000075389352, [49.0, 1.0, 234])
2        (899883993, [32.0, 0.0, 125])
3        (731317391, [81.0, 1.0, 576])
4        (235678655, [12.0, 1.0, 235])
dtype: object

# print(df)
  language  shelf_id                                                      mapping
0  English      4560  {742005: [10.2, 1.0, 456], 6000075389352: [49.0, 1.0, 234]}
1   French      4560                                {899883993: [32.0, 0.0, 125]}
2   French      7868   {731317391: [81.0, 1.0, 576], 235678655: [12.0, 1.0, 235]}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章