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

如何高效(向量化)将Pandas列与对应年度系数相乘?

高效实现年度参数与DataFrame列的向量化相乘

首先先还原你的原始数据和需求:

你有一个带Datetime索引的DataFrame:

import pandas as pd

df = pd.DataFrame( {'test':[1, 1, 1, 1, 1, 1]}, 
                   index=[ '2018-01-01', '2018-01-02', '2018-01-03', 
                           '2019-01-03', '2019-01-02', '2020-01-02' ] )
df.index = pd.to_datetime(df.index)

同时有年度参数列表 yearly_parameter = [1, 2, 3],分别对应2018、2019、2020年,需要将test列与对应年度参数相乘得到answer列。


高效向量化实现方案

这里推荐用字典映射+向量化操作,既高效又直观,完全避免循环:

  1. 先创建年份到参数的映射字典:
# 利用参数列表的顺序快速生成映射
year_map = {2018 + idx: param for idx, param in enumerate(yearly_parameter)}
# 也可以手动定义(可读性更强)
# year_map = {2018:1, 2019:2, 2020:3}
  1. 提取索引的年份,映射到对应参数后与test列相乘:
df['answer'] = df['test'] * df.index.year.map(year_map)

执行后输出的结果完全符合预期:

test  answer
2018-01-01     1       1
2018-01-02     1       1
2018-01-03     1       1
2019-01-03     1       2
2019-01-02     1       2
2020-01-02     1       3

如果你的年份是连续无断层的,也可以用更简洁的numpy向量化索引(效率略高):

import numpy as np
start_year = 2018
# 计算年份偏移量作为列表索引,直接批量取值
df['answer'] = df['test'].values * np.array(yearly_parameter)[df.index.year - start_year]

关于用列表存储年度参数的合理性

  • 适合场景:如果你的年份是连续且严格按顺序递增的(比如从2018开始每年都有数据),用列表存储是可以的,通过年份偏移量就能快速对应参数,节省一点定义字典的代码。
  • 不推荐场景:如果年份可能出现断层(比如缺少某一年的数据)、或者参数对应的年份顺序有变化,列表的可读性和容错性会很差——你需要反复确认列表索引和年份的对应关系,很容易出错。

更稳妥的选择:用字典直接存储{年份: 参数}的键值对,不管年份是否连续,都能准确映射,代码可读性更强,后期维护也更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:11:27