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

使用pd.merge按索引左连接DataFrame后出现NaN值的问题

解决pandas合并DataFrame后出现全NaN的问题

嗨,我来帮你捋清楚为啥合并后join的列全是NaN,以及怎么快速解决这个问题:

问题根源

你现在用的left_index=True和right_index=True是基于索引来合并两个DataFrame,但这完全没用到你真正想要关联的Subject列:

  • 你的df索引是默认的整数序列(0、1、2),而join的索引要么是默认的0,要么是分组后得到的小写weather(和df里的大写Weather完全不匹配),两个索引没有任何交集,left join自然会把join的列全部填充为NaN。
  • 另外还有个细节坑:join里的Subject值是小写weather,但df里是大写Weather,就算你用列合并,大小写不匹配也会导致关联失败。

正确的解决方案

方案1:用Subject列直接关联(推荐)

这是最直观的方式,先确保两个DataFrame的Subject列值一致,再用on='Subject'指定关联键:

# 先修正join里Subject的大小写,和df保持一致
join['Subject'] = join['Subject'].str.capitalize()

# 或者重新计算join的时候,直接保留Subject为列(不要设为索引)
join = df.groupby('Subject', as_index=False).mean()
join = join.rename(columns={'interrupts': 'interrupts_mean', 'indegree': 'indegree_mean'})

# 然后执行合并
merged_df = pd.merge(df, join, on='Subject', how='left')

方案2:用索引合并(适合必须用索引的场景)

如果一定要基于索引合并,需要把两个DataFrame的索引都设置为Subject,并且确保值的大小写一致:

# 将df的索引设置为Subject
df_indexed = df.set_index('Subject')

# 修正join的Subject值大小写,并设置为索引
join_indexed = join.set_index('Subject').rename(index={'weather': 'Weather'})

# 执行索引合并
merged_df = pd.merge(df_indexed, join_indexed, left_index=True, right_index=True, how='left')

执行上面的任意一种方案后,你就能得到正确合并后的DataFrame,不会再出现全NaN的情况啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:26:25