如何在Python中对指定日期前(含该日)的DataFrame列值按列乘不同系数?
按日期筛选并对指定列执行差异化乘法操作
问题场景
现有如下Pandas DataFrame:
df: ticker A B C date 2022-01-02 145 100 100 2022-01-03 450 200 241 2022-01-04 100 200 NaN 2022-01-05 424 324 222 2022-01-06 400 421 320
需要实现的需求:对日期2022-01-04及之前的数据,按列执行差异化乘法:列A的值乘以2,列B的值乘以8,列C的值乘以4;2022-01-04之后的数据保持不变。预期结果如下:
df2: ticker A B C date 2022-01-02 290 800 400 2022-01-03 900 1600 964 2022-01-04 200 1600 NaN 2022-01-05 424 324 222 2022-01-06 400 421 320
解决方案
方法1:使用loc复制修改(直观易读)
先确保日期索引为datetime类型,再通过布尔索引筛选目标行,对指定列执行乘法:
import pandas as pd # 转换索引为datetime类型(若原索引不是datetime则必须执行) df.index = pd.to_datetime(df.index) # 定义各列对应的乘数 col_multipliers = {'A': 2, 'B': 8, 'C': 4} # 复制原DataFrame避免修改源数据 df2 = df.copy() # 筛选日期<=2022-01-04的行,对指定列应用乘数 df2.loc[df2.index <= '2022-01-04', col_multipliers.keys()] *= col_multipliers.values()
方法2:使用where构造新DataFrame(非原地修改)
利用where方法的特性:保留条件为True的原值,替换条件为False的行,适合直接生成新结果:
import pandas as pd df.index = pd.to_datetime(df.index) # 构造与列匹配的乘数Series multipliers_series = pd.Series([2, 8, 4], index=['A', 'B', 'C']) # 日期大于2022-01-04的保留原值,否则乘以对应乘数 df2 = df.where(df.index > '2022-01-04', df * multipliers_series)
注意事项
- 必须确保日期列/索引是
datetime类型,否则日期比较会失效,可通过pd.to_datetime()完成转换。 - 如果日期是普通列而非索引,只需将代码中的
df.index替换为df['date']即可。 - NaN值在乘法操作后会保持NaN,符合预期结果。
内容的提问来源于stack exchange,提问作者MathMan 99
相关产品推荐
相关产品推荐

