Pandas按经纬度合并DataFrame时行数异常增多问题咨询
问题根因
行数异常增长是两个问题叠加导致的:
- 去重代码完全未生效:pandas的
drop_duplicates()默认不修改原DataFrame,你在load_elev和Load_grid函数里调用去重方法时,没有将返回结果重新赋值给变量,也没有加inplace=True参数,实际读取的两个DataFrame中仍然存在重复的经纬度组合。
当merge的关联键(这里是纬度、经度)存在重复值时,pandas会对重复键的条目做笛卡尔积匹配:比如同一个经纬度在df1有2条、df2有2条,匹配后会生成4条记录,直接导致总行数超出预期。 - 经纬度一致性校验逻辑有漏洞:你通过排序后直接对比数组的方式判断经纬度完全一致,但如果两个表的重复经纬度条目数量不对等,这种对比方式无法识别出重复键问题,会误导你认为两个表的经纬度是一一对应的。
另外你最初用how='outer'做外连接,只要两个表存在任意一方独有的经纬度,也会额外增加行数,既然你确认经纬度完全对应,用inner内连接即可。
修复方案
- 首先修正去重逻辑,确保传入merge的两个DataFrame关联键无重复:
def load_elev(): el = pd.read_csv(r'Df1') # 修正:将去重结果赋值回原变量 el = el.drop_duplicates(subset=['Longitude', 'Latitude']) return el def Load_grid(): grd = pd.read_csv(r'Df2') # 修正:将去重结果赋值回原变量 grd = grd.drop_duplicates(subset=['Longitude', 'Latitude']) return grd
- 合并前先校验关联键唯一性,确保重复值已经被清除:
# 输出应为0,代表无重复经纬度 print("df1重复经纬度数:", el[['Latitude', 'Longitude']].duplicated().sum()) print("df2重复经纬度数:", grd[['Latitude', 'Longitude']].duplicated().sum())
- 考虑到经纬度是浮点数,为避免隐式精度误差导致的匹配异常,可以关联前先将经纬度保留固定小数位(从你的样例看所有经纬度都是1位小数):
el[['Latitude', 'Longitude']] = el[['Latitude', 'Longitude']].round(1) grd[['Latitude', 'Longitude']] = grd[['Latitude', 'Longitude']].round(1)
完成以上步骤后再调用merge,输出的结果行数会和单表有效数据行数完全一致,不会出现异常增长。
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

