You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:00:02