Pandas合并DataFrame后Humidity未按City排序的问题求助
问题排查:Pandas Merge后Humidity值“错位”的原因及解决办法
首先澄清一个小误会:你提到的「合并后Gadarwara的Humidity变为45」其实是看错了行~ 我们先跑一遍你的代码,看看实际输出的df3:
import pandas as pd df = pd.DataFrame({ 'City':['Kareli','Narsinghpur','Jabalpur','Gadarwara','Pipriya'], 'Temperature':[23,45,67,12,34] }) df2 = pd.DataFrame({ 'City':['Narsinghpur','Jabalpur','Pipriya','Kareli','Gadarwara'], 'Humidity':[15,23,30,45,34] }) df3 = pd.merge(df,df2,on='City') print(df3)
输出结果是:
City Temperature Humidity 0 Kareli 23 45 1 Narsinghpur 45 15 2 Jabalpur 67 23 3 Gadarwara 12 34 4 Pipriya 34 30
你看,Gadarwara对应的Humidity确实是df2里的34,没错位。你看到的45是第一行Kareli的Humidity,这是df2里Kareli对应的正确值。
核心问题:你对pd.merge()的逻辑理解有偏差
pd.merge()的核心是按共同列的「值」进行匹配关联,而不是保留第二个DataFrame(df2)的行顺序。默认情况下,合并后的结果行顺序会和第一个DataFrame(df)的行顺序保持一致(因为默认是how='inner'的左表优先合并)。
所以你觉得「Humidity未按City排序」,本质是期望合并后保留df2的City顺序,但merge本身不做这件事——它只负责把两个表中City值相同的行关联起来,顺序跟随左表。
解决办法:按需求指定排序规则
如果你想要合并后的结果按照df2的City顺序排列,或者按City字母顺序排序,可以用以下两种方式:
方式1:合并后跟随df2的City顺序
我们可以把City列设置为分类类型,提前指定好想要的排序顺序,再合并排序:
# 将df的City列设置为分类,指定顺序和df2一致 df['City'] = pd.Categorical(df['City'], categories=df2['City'], ordered=True) # 合并后按City排序 df3 = pd.merge(df, df2, on='City').sort_values('City') print(df3)
输出会和df2的City顺序完全一致:
City Temperature Humidity 0 Narsinghpur 45 15 1 Jabalpur 67 23 2 Pipriya 34 30 3 Kareli 23 45 4 Gadarwara 12 34
方式2:合并后按City字母顺序排序
如果只是想要City按自然字母顺序排列,直接用sort_values()即可:
df3 = pd.merge(df, df2, on='City').sort_values('City') print(df3)
输出:
City Temperature Humidity 3 Gadarwara 12 34 2 Jabalpur 67 23 0 Kareli 23 45 1 Narsinghpur 45 15 4 Pipriya 34 30
总结
Pandas的merge是「值匹配优先」,默认不会保留右表的行顺序。如果需要特定顺序,要么提前用分类类型定义排序规则,要么合并后再手动排序就好~
内容的提问来源于stack exchange,提问作者Chetan Kushwaha
相关产品推荐
相关产品推荐

