Python:多索引DataFrame合并后结果为空的问题求助
问题分析与解决方案
核心问题1:合并列名拼写错误
你写的代码里用了on=['fecha','CP'],但两个DataFrame的时间列实际都是date,这个拼写错误会导致Pandas找不到匹配的合并键,直接返回空结果集。
核心问题2:数据可能无交集
从你给出的样本数据来看:
clima_mod_15m的CP值是15001这类,而nodos_mod的CP是41920这类,两者无重叠clima_mod_15m的起始时间是2022-04-06,nodos_mod的起始时间是2022-03-19,时间范围也没有重叠
即使修正了列名,没有同时匹配date和CP的行,合并结果依然会是空的。
验证与修复步骤
1. 修正合并列名
先把代码里的fecha改成date:
test = pd.merge(nodos_mod, clima_mod_15m, on=['date', 'CP']) print(len(test))
2. 检查数据是否有交集
执行以下代码确认两个DataFrame是否存在共同的CP值和重叠的时间范围:
# 检查共同的CP值 common_cps = set(nodos_mod['CP']).intersection(set(clima_mod_15m['CP'])) print("共同CP值:", common_cps) # 检查时间范围 print("nodos_mod时间区间:", nodos_mod['date'].min(), "~", nodos_mod['date'].max()) print("clima_mod_15m时间区间:", clima_mod_15m['date'].min(), "~", clima_mod_15m['date'].max())
3. 处理索引的问题
你提到两个DataFrame都以date和CP作为索引,若要基于索引合并,需调整代码为:
# 基于(date, CP)复合索引合并 test = pd.merge(nodos_mod, clima_mod_15m, left_index=True, right_index=True)
或者先将索引转为普通列再合并:
nodos_mod = nodos_mod.reset_index() clima_mod_15m = clima_mod_15m.reset_index() test = pd.merge(nodos_mod, clima_mod_15m, on=['date', 'CP'])
4. 若数据无交集的替代方案
如果确实没有同时匹配date和CP的行,可以考虑:
- 确认数据源是否正确(比如是否拿错了不同区域的CP数据)
- 使用按最近时间匹配的
merge_asof(先按CP匹配,再找最近的时间点):
# 先按CP和date排序 nodos_mod_sorted = nodos_mod.sort_values(['CP', 'date']) clima_mod_sorted = clima_mod_15m.sort_values(['CP', 'date']) # 按CP匹配,找每个nodos记录最近的clima记录 test = pd.merge_asof(nodos_mod_sorted, clima_mod_sorted, on='date', by='CP', direction='nearest')
内容的提问来源于stack exchange,提问作者Francisco Hernandez
相关产品推荐
相关产品推荐

