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

逐行对比两个Pandas DataFrame并按日期匹配插入对应列值的问题

原代码问题

  • 对齐逻辑错误:你使用行位置索引iloc[i]直接对齐两个表的行,没有按date字段的实际值匹配。由于raw_data缺少2010-01-04、2010-01-06两行,会出现数据错位,把raw_data对应日期的值塞到complete_data错误的行上。
  • 判断逻辑无效:你写的if和else分支执行完全相同的赋值操作,判断条件等于没有生效。
  • 匹配规则错误:判断条件raw_data['date'].iloc[i] in complete_data['date'].iloc[i]是判断raw_data第i行的日期字符串是否被包含在complete_data第i行的日期字符串里,完全不符合“两个date值相等才算匹配”的需求。

正确实现方案

直接使用Pandas内置的左连接merge方法即可实现需求,无需手动写循环,性能更高且逻辑清晰:

import pandas as pd
import numpy as np

complete_data = pd.DataFrame({'date':['2010-01-01','2010-01-02','2010-01-03','2010-01-04','2010-01-05','2010-01-06','2010-01-07','2010-01-08']})
raw_data  = pd.DataFrame({'date':['2010-01-01','2010-01-02','2010-01-03','2010-01-05','2010-01-07','2010-01-08'],
                          'P1':['4.4','5.2','5.6','6.2','6.5','7.2'],
                          'P2':['200','220','230','250','270','280']})

# 左连接,以complete_data的date为准匹配raw_data的字段
complete_data = complete_data.merge(raw_data, on='date', how='left')

运行后输出结果如下,完全符合需求:

date   P1   P2
0  2010-01-01  4.4  200
1  2010-01-02  5.2  220
2  2010-01-03  5.6  230
3  2010-01-04  NaN  NaN
4  2010-01-05  6.2  250
5  2010-01-06  NaN  NaN
6  2010-01-07  6.5  270
7  2010-01-08  7.2  280

如果你一定要修改原有循环实现,需要先根据date值查找complete_data中对应的行索引再赋值,示例如下:

# 原有逻辑修改版(不推荐,效率低于merge方法)
column_labels = list(raw_data.columns[1:])
complete_data[column_labels] = np.nan

for _, row in raw_data.iterrows():
    # 查找complete_data中date匹配的行索引
    match_idx = complete_data[complete_data['date'] == row['date']].index
    if not match_idx.empty:
        complete_data.loc[match_idx, column_labels] = row[column_labels].values

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:36:01