使用Pandas按索引合并DataFrame后结果为空的原因
Pandas merge结果为空的原因及解决办法
问题重现
执行以下代码合并两个DataFrame后结果为空:
import pandas as pd merger = pd.merge(COMMODITY, df_new, left_index=True, right_index=True)
数据详情
COMMODITY结构及数据:
date value date_id date 2023-04-04 2023-04-04 1523.50 2023-04-04 2023-04-04 2023-04-04 1521.25 2023-04-04
df_new结构及数据:
date Pos_Neg COMAN 2021-03-05 0.131192 0.131192 2021-03-18 0.291161 0.291161 2021-03-31 -1.042225 -1.042225
核心原因
- 索引无重叠交集:COMMODITY的索引是
2023-04-04,而df_new的索引都是2021年的日期,两者完全没有共同的索引值。 - merge默认逻辑是inner join:
pd.merge默认使用内连接,只有两边键值完全匹配的行才会被保留。因为两个DataFrame的索引没有任何交集,所以合并后自然为空。
解决方案
1. 按date列而非索引合并(如果业务逻辑是匹配日期列)
如果你的目标是通过date列匹配数据,而不是索引,修改代码为:
merger = pd.merge(COMMODITY, df_new, on='date')
注意:当前两份数据的date列也没有重叠值,所以执行后结果仍为空,需要确保数据中有相同的日期值才会得到匹配结果。
2. 使用外连接保留所有数据
如果需要保留两个DataFrame的所有行,无匹配的字段用NaN填充,使用how='outer'参数:
merger = pd.merge(COMMODITY, df_new, left_index=True, right_index=True, how='outer')
关于COMMODITY中date重复的说明
COMMODITY里出现重复的date(包括索引和列),大概率是原始数据中存在多条同一天的记录(比如同一日期不同批次/时段的商品数据),或者上游代码在生成数据时重复写入了。
如果需要处理重复数据,可以选择:
- 直接去重:
COMMODITY_unique = COMMODITY.drop_duplicates() - 按日期聚合(比如取value的平均值):
COMMODITY_agg = COMMODITY.groupby('date').agg({'value': 'mean', 'date_id': 'first'}).reset_index()
内容的提问来源于stack exchange,提问作者MateMalte
相关产品推荐
相关产品推荐

