Pandas按County列合并DataFrame行数暴涨及坐标列生成方案
问题原因
执行默认merge合并后行数暴涨,核心原因是cnty表的County列存在重复县域名称,合并时触发一对多笛卡尔积匹配,把所有同名县的记录都和df的对应行做了关联,最终行数远超出原df的3221行。
实现方案
1. 格式预处理(推荐)
先统一两个表County列的格式,去除首尾多余空格,避免因隐形格式问题导致匹配失败:
df['County'] = df['County'].str.strip() cnty['County'] = cnty['County'].str.strip()
2. 经纬度表去重
对cnty表按County列去重,保证每个县域仅保留唯一一条经纬度记录,从根源避免一对多匹配导致的行数扩增:
cnty_dedup = cnty.drop_duplicates(subset='County', keep='first')
3. 左连接匹配
使用左连接规则,以原df为左表做关联,全程保留df原有3221行数据不变:
df = pd.merge( df, cnty_dedup[['County', 'lat', 'lng']], on='County', how='left' )
4. 生成指定格式坐标列
按照要求构造map_cordinates列:
df['map_cordinates'] = df.apply( lambda x: {"type": "Point", "coordinates": [[x['lat']], [x['lng']]]}, axis=1 )
结果校验
- 合并完成后执行
print(len(df)),输出结果应为3221,和原df行数完全一致 - 若存在经纬度为空的记录,可执行
print(df[df['lat'].isna()]['County'].tolist())查看未匹配成功的县域,排查是否存在名称拼写不一致问题 - 若不需要单独保留lat、lng列,可执行
df = df.drop(columns=['lat', 'lng'])删除冗余列
内容的提问来源于stack exchange,提问作者Lalit Joshi
相关产品推荐
相关产品推荐

