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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:31:07