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

基于年份匹配的DataFrame跨列除法运算实现需求

没问题,这个需求用Pandas很容易实现,我给你两种方案——一种直观易懂,另一种更高效适合大数据量:

解决方案

先假设我们有如下示例数据(你可以替换成自己的真实数据):

import pandas as pd

# 示例df1
df1 = pd.DataFrame({
    "year_t": [2020, 2021, 2022],
    "data_t": [100, 200, 300],
    "data_t_1": [90, 180, 270],
    "data_t_2": [80, 160, 240],
    "data_t_3": [70, 140, 210]
})

# 示例df2
df2 = pd.DataFrame({
    "year": [2017, 2018, 2019, 2020, 2021, 2022],
    "multiplyer": [2, 2.5, 3, 4, 5, 6]
})

方法一:逐行处理(直观易懂)

这种方式逻辑清晰,适合数据量不大的场景:

  1. 先把df2转换成年份:乘数的字典,方便快速查找对应年份的乘数
  2. 定义一个函数,对df1的每一行计算各个output列
  3. 用apply把函数应用到每一行
# 转换df2为字典,快速查找乘数
multiplier_dict = df2.set_index('year')['multiplyer'].to_dict()

def compute_outputs(row):
    base_year = row['year_t']
    # 按规则计算每个output列
    row['output_t'] = row['data_t'] / multiplier_dict.get(base_year, float('nan'))
    row['output_t_1'] = row['data_t_1'] / multiplier_dict.get(base_year - 1, float('nan'))
    row['output_t_2'] = row['data_t_2'] / multiplier_dict.get(base_year - 2, float('nan'))
    row['output_t_3'] = row['data_t_3'] / multiplier_dict.get(base_year - 3, float('nan'))
    return row

# 生成结果
result_df = df1.apply(compute_outputs, axis=1)

方法二:向量化操作(高效)

如果你的数据量很大,逐行处理会比较慢,推荐用向量化操作,利用Pandas的内置方法提升效率:

  1. 用map方法批量获取每个滞后年份对应的乘数
  2. 直接做列级别的除法运算
# 批量获取各个年份的乘数
df1['multiplier_t'] = df1['year_t'].map(multiplier_dict)
df1['multiplier_t_1'] = df1['year_t'].sub(1).map(multiplier_dict)
df1['multiplier_t_2'] = df1['year_t'].sub(2).map(multiplier_dict)
df1['multiplier_t_3'] = df1['year_t'].sub(3).map(multiplier_dict)

# 计算output列
df1['output_t'] = df1['data_t'] / df1['multiplier_t']
df1['output_t_1'] = df1['data_t_1'] / df1['multiplier_t_1']
df1['output_t_2'] = df1['data_t_2'] / df1['multiplier_t_2']
df1['output_t_3'] = df1['data_t_3'] / df1['multiplier_t_3']

# 可选:删除中间生成的multiplier列
result_df = df1.drop(['multiplier_t', 'multiplier_t_1', 'multiplier_t_2', 'multiplier_t_3'], axis=1)

注意事项

  • 如果某个年份在df2中不存在,map或get会返回NaN,你可以根据需求用fillna()填充默认值(比如fillna(1)表示默认除以1)
  • 两种方法最终得到的result_df都会包含原始df1的列和新生成的output_t、output_t_1等列

内容的提问来源于stack exchange,提问作者user113156

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:20:11