如何在GroupBy中独立聚合字符串字段并关联其他统计结果
问题描述
我有如下数据:
df1
| Store(门店) | owner(店主) |
|---|---|
| Store1 | A |
| Store1 | B |
| Store2 | B |
| Store2 | C |
df2
| Store(门店) | Sold_Item(售出商品) | Price(价格) |
|---|---|---|
| Store1 | Apple | 2 |
| Store1 | Orange | 3 |
| Store1 | Apple | 2 |
| Store2 | Apple | 3 |
| Store | Banana | 2 |
我期望得到如下格式的结果:
| Store(门店) | Owners(店主) | Num_Sales(销售数量) | Revenue(营收) |
|---|---|---|---|
| Store1 | A | 3 | 7 |
| B | |||
| Store2 | B | 2 | 5 |
| C |
我尝试了以下代码:
df = df1.merge(df2, how='inner', on='Store') df_stats = df.groupby(['Store']).agg({"Sold_Item": np.count, "Price": 'sum'})
但不知道如何处理Owner字段,恳请提供解决方案。
解决方案
要实现目标格式,可按以下步骤操作:
- 清理并计算门店销售统计:先修正df2中可能的门店名称错误(最后一行
Store应为Store2,否则会被过滤),再按门店聚合计算销售数量和营收:
import pandas as pd import numpy as np # 修正df2的门店名称错误(按需调整) df2.loc[df2['Store(门店)'] == 'Store', 'Store(门店)'] = 'Store2' # 计算每个门店的销售统计 store_stats = df2.groupby('Store(门店)').agg( Num_Sales=('Sold_Item(售出商品)', 'count'), Revenue=('Price(价格)', 'sum') ).reset_index()
- 合并店主与统计数据并处理格式:将店主表和统计表关联,然后让同一门店仅第一行显示门店名称,其余行留空:
# 合并数据 result = df1.merge(store_stats, on='Store(门店)', how='left') # 处理门店列:重复门店名置空 result['Store(门店)'] = result['Store(门店)'].mask(result['Store(门店)'].duplicated(), '') # 重命名列匹配期望结果 result = result.rename(columns={'owner(店主)': 'Owners(店主)'})
- 调整列顺序:
# 调整为目标列顺序 result = result[['Store(门店)', 'Owners(店主)', 'Num_Sales(销售数量)', 'Revenue(营收)']]
运行后得到的result就完全符合你想要的格式。如果df2中Store是有效门店名,由于df1中无对应店主,inner join后会被排除,不影响现有门店的结果。
内容的提问来源于stack exchange,提问作者swygerts
相关产品推荐
相关产品推荐

