在Python中基于两个独立DataFrame进行分组计算
解决按group和sub-group计算value1/value2的问题
核心思路
不需要单独使用groupby,直接通过**合并(merge)**将两个DataFrame按group和sub-group对齐,再计算比值是最直接的方案——因为你需要的是两个DF中对应分组的数值匹配计算,而非单DF的聚合操作。
步骤实现
1. 合并两个DataFrame(保留所有分组组合)
使用outer join模式合并,确保两个DF中所有group+sub-group的组合都被保留,缺失的value1或value2会自动填充为NaN:
import pandas as pd # 你的原始DataFrame定义 df1 = pd.DataFrame({'sub-group':['2020','2030','2040','2030','2040','2030','2040'], 'group':['a', 'a', 'a', 'b', 'b', 'c', 'c'], 'value1':[12,11,41,33,66,22,20]}) df2 = pd.DataFrame({'sub-group':['2020','2030','2040', '2020', '2030','2040','2030','2040'], 'group':['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c'], 'value2':[10,20,30,15,45,60,12,36]}) # 按group和sub-group做outer合并 merged_df = pd.merge(df1, df2, on=['group', 'sub-group'], how='outer')
2. 计算比值并处理缺失值
直接对合并后的DF做除法运算,不匹配的分组会得到NaN;如果需要将NaN替换为0,使用fillna()即可:
# 计算value1/value2,不匹配的分组返回NaN merged_df['value_ratio'] = merged_df['value1'] / merged_df['value2'] # 可选:将NaN替换为0 merged_df['value_ratio'] = merged_df['value_ratio'].fillna(0)
最终结果示例
合并并计算后的DF会包含所有分组组合,比如group=b, sub-group=2020的value1为NaN,对应的value_ratio会是NaN(或替换后的0):
| group | sub-group | value1 | value2 | value_ratio |
|---|---|---|---|---|
| a | 2020 | 12 | 10 | 1.2 |
| a | 2030 | 11 | 20 | 0.55 |
| a | 2040 | 41 | 30 | 1.3667 |
| b | 2020 | NaN | 15 | NaN(或0) |
| b | 2030 | 33 | 45 | 0.7333 |
| b | 2040 | 66 | 60 | 1.1 |
| c | 2030 | 22 | 12 | 1.8333 |
| c | 2040 | 20 | 36 | 0.5556 |
补充:如果必须用groupby的方案
如果一定要基于groupby实现,可先对两个DF分别按分组提取数值,再合并计算:
# 对df1按分组取value1(每个分组仅一条记录,用first/sum均可) df1_grouped = df1.groupby(['group', 'sub-group'])['value1'].first().reset_index() # 对df2同理 df2_grouped = df2.groupby(['group', 'sub-group'])['value2'].first().reset_index() # 合并并计算比值 merged_grouped = pd.merge(df1_grouped, df2_grouped, on=['group', 'sub-group'], how='outer') merged_grouped['value_ratio'] = merged_grouped['value1'] / merged_grouped['value2']
内容的提问来源于stack exchange,提问作者Novic
相关产品推荐
相关产品推荐

