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

如何在Pandas中按年份匹配将月度与年度DataFrame列相乘

解决月度与年度DataFrame按年份匹配相乘的问题

嘿,这个需求在处理时间序列数据时挺常见的,咱们可以通过建立年份关联来轻松完成两个DataFrame的列相乘操作。先确认下你的示例数据:

import pandas as pd

# 月度采样数据
df1 = pd.DataFrame({'column1' : [1, 1, 1, 2, 2]}, index=['2018 - 01', '2018 - 02', '2018 - 03', '2019 - 01', '2019 - 02'])
# 年度采样数据
df2 = pd.DataFrame({'columnX' : [2, 3]}, index=['2018', '2019'])

下面给你三种实用的解决方法,你可以根据自己的习惯选择:

方法一:提取年份后映射匹配

这是最直接的思路——先从df1的索引里提取出年份,再用年份作为键去df2里匹配对应的年度值,最后完成相乘:

# 从df1的索引中提取年份(分割空格后的第一个元素)
df1['year'] = df1.index.str.split(' ').str[0]
# 用年份映射df2的columnX值,再和column1相乘
df1['result'] = df1['column1'] * df1['year'].map(df2['columnX'])

print(df1)

运行后会得到你想要的结果:

column1  year  result
2018 - 01        1  2018       2
2018 - 02        1  2018       2
2018 - 03        1  2018       2
2019 - 01        2  2019       6
2019 - 02        2  2019       6

方法二:利用时间序列重采样对齐

如果你的索引本身是时间格式(或者可以转换为时间格式),用pandas的时间序列功能会更省心,不用手动处理字符串:

# 将两个DataFrame的索引转为datetime类型
df1.index = pd.to_datetime(df1.index)
df2.index = pd.to_datetime(df2.index)

# 把年度数据重采样为月度,用ffill填充每个月的年度值
df2_monthly = df2.resample('M').ffill()
# 直接对齐索引后相乘
df1['result'] = df1['column1'] * df2_monthly['columnX']

print(df1)

这个方法会自动帮你完成年份的匹配,结果和方法一完全一致,适合处理规范的时间索引数据。

方法三:合并DataFrame后计算乘积

如果你更习惯用合并操作,也可以先把两个DataFrame按年份合并,再计算乘积,逻辑更直观:

# 提取df1的年份作为新列
df1['year'] = df1.index.str.split(' ').str[0]
# 把df2的索引转为普通列,方便合并
df2_reset = df2.reset_index().rename(columns={'index': 'year'})

# 按年份左合并两个DataFrame,保证月度数据的完整性
merged_df = pd.merge(df1, df2_reset, on='year', how='left')
# 计算乘积
merged_df['result'] = merged_df['column1'] * merged_df['columnX']

# 恢复原来的月度索引
print(merged_df.set_index(df1.index))

这种方法的好处是你可以清晰看到每一行对应的年度值,排查问题更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:30:34