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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:25:30