基于年份匹配的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] })
方法一:逐行处理(直观易懂)
这种方式逻辑清晰,适合数据量不大的场景:
- 先把df2转换成年份:乘数的字典,方便快速查找对应年份的乘数
- 定义一个函数,对df1的每一行计算各个output列
- 用
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的内置方法提升效率:
- 用
map方法批量获取每个滞后年份对应的乘数 - 直接做列级别的除法运算
# 批量获取各个年份的乘数 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
相关产品推荐
相关产品推荐

