使用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
相关产品推荐
相关产品推荐

