逐行对比两个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
相关产品推荐
相关产品推荐

