将 pandas GroupBy 中的列值聚合为字典
Aggregate column values in pandas GroupBy as a dict
这是我过去面试时的问题。
我们有包含以下列的输入数据:
语言、产品编号、货架编号、排名
例如,输入格式如下
English, 742005, 4560, 10.2
English, 6000075389352, 4560, 49
French, 899883993, 4560, 32
French, 731317391, 7868, 81
我们想对语言、货架 ID 列进行 "group by" 操作,并根据 "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 和具有该键的字典创建键来解决问题)
如有任何帮助,我们将不胜感激。
设置
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.groupby
按 Lang
和 shelf_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}
这是我过去面试时的问题。
我们有包含以下列的输入数据:
语言、产品编号、货架编号、排名
例如,输入格式如下
English, 742005, 4560, 10.2
English, 6000075389352, 4560, 49
French, 899883993, 4560, 32
French, 731317391, 7868, 81
我们想对语言、货架 ID 列进行 "group by" 操作,并根据 "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 和具有该键的字典创建键来解决问题)
如有任何帮助,我们将不胜感激。
设置
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.groupby
按 Lang
和 shelf_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}