我有一个与此问题相关的问题:将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}
谁能帮助我将此解决方案适应我的情况?任何建议,将不胜感激。
想法是创建一个新系列s
包含的项目为tuples
其中的元组的第一个项目是product_id
和第二项是含列的相应值的列表rank
,fiction
并且pages
,接下来我们使用Series.groupby
到组系列s
上language
,并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] 删除。
我来说两句