如何关联两个不同DataFrame完成计算?附分组统计实操场景
解决多DataFrame关联统计问题:以主管-渠道销售额计算为例
我来帮你搞定这个问题!先从你给的具体例子入手,再聊聊多DataFrame关联计算的通用思路~
第一步:处理具体业务场景
你给出的两个DataFrame里,df1是主管和销售人员的对应关系,df2是各销售人员分渠道、分月的销售额。要计算各主管按渠道的销售额,核心是把两个表通过「销售人员」关联起来,再分组聚合。
完整代码实现(用Pandas)
首先先还原你的两个DataFrame:
import pandas as pd # 构造df1:主管-销售对应表 df1 = pd.DataFrame({ 'supervisor': ['Supervisor1', 'Supervisor2', 'Supervisor2'], 'salesperson': ['Matt', 'Amelia', 'Philip'] }) # 构造df2:销售业绩表(宽格式) df2 = pd.DataFrame({ 'month': ['Jan', 'Jan', 'Feb', 'Feb'], 'channel': ['Internet', 'Cellphone', 'Internet', 'Cellphone'], 'Matt': [10, 20, 40, 30], 'Amelia': [50, 60, 40, 120], 'Philip': [20, 30, 30, 40] })
然后按以下步骤操作:
- 把宽格式的df2转成长格式:因为df2的列是销售人员名字,无法直接和df1关联,用
melt转成每行对应一个销售人员的业绩:
df2_long = df2.melt( id_vars=['month', 'channel'], # 保留不变的列 var_name='salesperson', # 原列名转为「销售人员」列 value_name='sales' # 原单元格值转为「销售额」列 )
- 关联两个DataFrame:通过
salesperson字段,把df1的主管信息合并到业绩表中:
merged_df = pd.merge(df2_long, df1, on='salesperson', how='left')
这里用how='left'是为了保留所有业绩数据,避免因为匹配不到主管而丢失数据(如果你的业务要求只保留有主管的销售,换成how='inner'即可)。
- 按渠道+主管分组计算总销售额:
final_result = merged_df.groupby(['channel', 'supervisor'])['sales'].sum().reset_index()
最终结果会是这样:
| channel | supervisor | sales |
|---|---|---|
| Cellphone | Supervisor1 | 50 |
| Cellphone | Supervisor2 | 210 |
| Internet | Supervisor1 | 50 |
| Internet | Supervisor2 | 110 |
多DataFrame关联计算的通用方法论
当你需要关联2个及以上DataFrame做统计时,遵循这几个准则能让你高效且不出错:
- 先统一关联键的格式:确保关联字段(比如这里的
salesperson)在所有表中格式一致——比如大小写统一、无空值、没有多余空格。如果有格式问题,合并后会出现大量NaN,影响结果。 - 优先把宽格式转成长格式:像df2这种以实体(销售人员)作为列的宽表,转成长表后更方便关联、分组和后续分析,这是处理这类数据的常用技巧。
- 选择合适的合并方式:
inner:只保留所有表都匹配到的记录(适合需要严格匹配的场景)left/right:保留左表/右表的所有记录,匹配不上的用NaN填充(适合不想丢失某一方数据的场景)outer:保留所有表的记录,匹配不上的用NaN填充(适合需要全量数据的场景)
- 分步验证每一步的结果:合并后先检查有没有异常的NaN,分组前确认合并的数据是否符合预期,避免一步错步步错。
- 精简数据再操作:如果DataFrame很大,先过滤掉不需要的列或行(比如不需要的月份、无关的字段),再进行合并和分组,能节省内存,提升运算速度。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

