在Pandas中实现基于店铺的DataFrame地区数值分组汇总
问题描述
原始DataFrame如下:
typeItem store region amountItems 0 Drink Toncat Colorado 100 1 Food Toncat Colorado 100 2 Toy Toncat Colorado 100 3 Cloth Toncat Colorado 100 4 Car Bent Mount 10 5 Moto Bent Mount 10 6 Bike Timo Mount 5 7 Fork Logo Iggo 50
已知每个地区包含多个店铺,amountItems字段已是各店铺的聚合值。需要按地区分组,对不同店铺的amountItems求和,生成新字段amountItemsRegion,期望输出如下:
typeItem store region amountItems amountItemsRegion 0 Drink Toncat Colorado 100 100 1 Food Toncat Colorado 100 100 2 Toy Toncat Colorado 100 100 3 Cloth Toncat Colorado 100 100 4 Car Bent Mount 10 15 5 Moto Bent Mount 10 15 6 Bike Timo Mount 5 15 7 Fork Logo Iggo 50 50
注:Colorado地区仅1家店铺,求和值为该店铺的数值;Mount地区有2家店铺,需对不同店铺的amountItems求和(10+5)。
实现方案
可以通过以下两种Pandas方式实现:
方式一:分组求和后合并
- 先按
region和store分组,提取每个店铺在对应地区的唯一amountItems值(因同一店铺的amountItems为聚合值,所有行数值一致); - 对每个
region下的店铺amountItems求和,得到地区级总和; - 将求和结果合并回原始DataFrame。
代码示例:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'typeItem': ['Drink', 'Food', 'Toy', 'Cloth', 'Car', 'Moto', 'Bike', 'Fork'], 'store': ['Toncat', 'Toncat', 'Toncat', 'Toncat', 'Bent', 'Bent', 'Timo', 'Logo'], 'region': ['Colorado', 'Colorado', 'Colorado', 'Colorado', 'Mount', 'Mount', 'Mount', 'Iggo'], 'amountItems': [100, 100, 100, 100, 10, 10, 5, 50] }) # 按地区+店铺取唯一值后,按地区求和 region_store_sum = df.groupby(['region', 'store'])['amountItems'].first().groupby('region').sum().reset_index(name='amountItemsRegion') # 合并回原始数据 df = df.merge(region_store_sum, on='region', how='left') print(df)
方式二:去重+transform映射
先去掉同一地区同一店铺的重复行,再按地区对amountItems求和,最后用transform将求和结果映射到原始DataFrame的每一行,一步生成目标字段。
代码示例:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'typeItem': ['Drink', 'Food', 'Toy', 'Cloth', 'Car', 'Moto', 'Bike', 'Fork'], 'store': ['Toncat', 'Toncat', 'Toncat', 'Toncat', 'Bent', 'Bent', 'Timo', 'Logo'], 'region': ['Colorado', 'Colorado', 'Colorado', 'Colorado', 'Mount', 'Mount', 'Mount', 'Iggo'], 'amountItems': [100, 100, 100, 100, 10, 10, 5, 50] }) # 生成amountItemsRegion字段 df['amountItemsRegion'] = df.drop_duplicates(['region', 'store']).groupby('region')['amountItems'].transform('sum') print(df)
内容的提问来源于stack exchange,提问作者gfernandes
相关产品推荐
相关产品推荐

