Pandas按组计算Col1、Col2与最新年份比值再相除生成新列
Pandas 分组基准比值计算实现方案
你需要的计算可以通过两种常用方式实现,代码和说明如下:
实现思路
核心逻辑是先按Group字段分组,提取每组2000年的Col_1和Col_2作为基准值,再广播到组内所有行按公式计算结果。
代码实现
方法1:groupby + apply 写法(易读性高,适合中小数据量)
import pandas as pd # 构造示例数据集 df = pd.DataFrame({'Year':[1995, 1996, 1997, 1998, 1999, 2000,1995, 1996, 1997, 1998, 1999, 2000], 'Group':['A', 'A', 'A','A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'], 'Col_1':[100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200], 'Col_2':[11, 22, 33, 44, 55, 66, 77, 88, 99, 199, 299, 399]}) # 分组计算函数 def calc_new_column(group): # 取当前组2000年的基准值 base_col1 = group.loc[group['Year']==2000, 'Col_1'].iloc[0] base_col2 = group.loc[group['Year']==2000, 'Col_2'].iloc[0] # 按公式计算新列 group['新列'] = (group['Col_1'] / base_col1) / (group['Col_2'] / base_col2) return group # 执行分组计算 df = df.groupby('Group', group_keys=False).apply(calc_new_column)
方法2:映射广播写法(性能更高,适合百万级以上大数据量)
# 提前提取所有组的2000年基准值,生成映射字典 base_col1_map = df[df['Year']==2000].set_index('Group')['Col_1'].to_dict() base_col2_map = df[df['Year']==2000].set_index('Group')['Col_2'].to_dict() # 直接按映射计算新列,不需要逐组遍历 df['新列'] = (df['Col_1'] / df['Group'].map(base_col1_map)) / (df['Col_2'] / df['Group'].map(base_col2_map))
结果验证
运行后可以看到:
- A组所有行的
新列值均为1,符合示例中Col_1和Col_2同比例增长的计算预期 - B组1995-1997年的
新列值为1,1998年计算结果约为1.67,和公式计算结果一致
内容的提问来源于stack exchange,提问作者Jiamei
相关产品推荐
相关产品推荐

