如何实现两个DataFrame匹配合并 插入经纬度列用于地图可视化
巴基斯坦选举数据经纬度匹配操作步骤
你现在的核心问题是两个数据集没有统一的关联键,且字段值存在格式、拼写不一致的问题,按以下步骤处理即可拿到可用于地图可视化的数据集:
1 清洗关联字段,统一匹配规则
两个数据集靠城市/地区名关联,必须先做标准化,否则会出现大量匹配失败的情况:
- 把经纬度数据集
df1的city列、选举数据集election_df2的District列所有值统一转为小写,去掉首尾空格、特殊字符 - 修正字段值的拼写错误,比如样例里选举数据集里卡拉奇的拼写是
Karchi,和经纬度数据集里的karachi不一致,必须提前修正,所有拼写错的地区名都要整理成替换字典统一处理 - 参考代码:
import pandas as pd # 清洗经纬度表的城市字段 df1["city_match"] = df1["city"].str.strip().str.lower() # 清洗选举表的地区字段 election_df2["district_match"] = election_df2["District"].str.strip().str.lower() # 修正拼写错误,实际使用时把所有错拼的地区补到字典里 spell_correction = {"karchi": "karachi"} election_df2["district_match"] = election_df2["district_match"].replace(spell_correction)
2 聚合得到每个选区的胜选政党
你需要展示的是各选区占比最高的政党,不要直接用候选人维度的原始数据合并,先做聚合:
- 按选区名称
ConstituencyTitle分组,取每个组里得票数Votes最高的记录,就是该选区的胜选方 - 参考代码:
# 按得票降序排序,每个选区取第一条即为最高票候选人/政党 winner_df = election_df2.sort_values("Votes", ascending=False)\ .groupby("ConstituencyTitle", as_index=False).first()
3 关联合并两个数据集
用清洗好的匹配字段做左连接,把经纬度信息挂到胜选数据上:
# 左连接保留所有选区的胜选数据,匹配对应经纬度 final_for_map = pd.merge( left=winner_df, right=df1[["city_match", "lat", "lon"]], left_on="district_match", right_on="city_match", how="left" ) # 一定要检查匹配结果,统计没匹配到经纬度的行,手动补全缺失的经纬度 print(f"未匹配到经纬度的选区共 {final_for_map['lat'].isna().sum()} 个")
4 可视化注意事项
拿到final_for_map表之后就可以直接做地图打点可视化,按Party字段给不同政党分配不同颜色即可:
- 如果同一个城市对应多个选区,同经纬度的点会重叠,可以给同城市的点加微小的经纬度偏移,避免点叠在一起看不清
- 如果要做更精准的选区填色图,可以替换成巴基斯坦选区边界的GeoJSON文件,按选区名称关联数据做面渲染,效果比打点更准确。
内容的提问来源于stack exchange,提问作者Abdul Wahab
相关产品推荐
相关产品推荐

