如何在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
相关产品推荐
相关产品推荐

