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

按年月匹配比较两个DataFrame数值,解决索引与维度不匹配问题

解决DataFrame按月日匹配对比的问题

现有两个DataFrame:

dfr1

qq
date                  
1956-01-01  685.519348
1956-01-02  731.868500
1956-01-03  510.579375
1956-01-04  412.347250
1956-01-05  358.297625
2010-12-27  3.992000
2010-12-28  1.099583
2010-12-29  104.428958
2010-12-30  4.932750
2010-12-31  101.737292
2013-12-27  7.992000
2013-12-28  105.099583
2013-12-29  104.428958
2013-12-30  102.932750
2013-12-31  101.737292

dfr2

q_t
01-01  61.629342
01-02  61.409750
01-03  61.309208
01-04  61.161462
01-05  61.020508
12-27  69.065375
12-28  68.935908
12-29  68.603104
12-30  68.474458
12-31  68.209075

需求与问题

需要判断dfr1中qq值是否≤dfr2对应月日的q_t值,但直接对比时因维度不同、索引不匹配报错:

dfr1.compare(dfr2)
# 报错:ValueError: Can only compare identically-labeled (both index and columns) DataFrame objects

dfr1['new'] = dfr1 < dfr2
# 报错:ValueError: Can only compare identically-labeled (both index and columns) DataFrame objects

解决方案

核心思路是统一两者的匹配键(提取dfr1索引的月日,和dfr2的索引对齐),具体步骤如下:

  1. 确保dfr1索引为datetime类型(如果原始索引不是的话):
import pandas as pd

# 转换索引为datetime格式
dfr1.index = pd.to_datetime(dfr1.index)
  1. 提取月日并匹配dfr2的q_t值:
# 从dfr1的日期索引中提取月日字符串,格式和dfr2索引一致
dfr1['month_day'] = dfr1.index.strftime('%m-%d')

# 根据月日匹配dfr2的q_t值,添加到dfr1中
dfr1['q_t'] = dfr1['month_day'].map(dfr2['q_t'])
  1. 执行比较并生成结果列:
# 判断qq是否小于等于q_t,生成布尔结果列
dfr1['qq_le_qt'] = dfr1['qq'] <= dfr1['q_t']

最终结果示例

处理后dfr1会新增匹配和结果列:

qq month_day      q_t  qq_le_qt
date                  
1956-01-01  685.519348    01-01  61.629342     False
1956-01-02  731.868500    01-02  61.409750     False
1956-01-03  510.579375    01-03  61.309208     False
1956-01-04  412.347250    01-04  61.161462     False
1956-01-05  358.297625    01-05  61.020508     False
2010-12-27    3.992000    12-27  69.065375      True
2010-12-28    1.099583    12-28  68.935908      True
2010-12-29  104.428958    12-29  68.603104     False
2010-12-30    4.932750    12-30  68.474458      True
2010-12-31  101.737292    12-31  68.209075     False
2013-12-27    7.992000    12-27  69.065375      True
2013-12-28  105.099583    12-28  68.935908     False
2013-12-29  104.428958    12-29  68.603104     False
2013-12-30  102.932750    12-30  68.474458     False
2013-12-31  101.737292    12-31  68.209075     False

如果不需要中间列,可最后删除:

dfr1.drop(['month_day', 'q_t'], axis=1, inplace=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:35:53