Pandas merge匹配共同字段时产生大量重复行如何解决?
问题原因
- 你当前仅用
Country/Region作为合并键,但这个字段在两个数据集中存在大量重复值:同一国家/地区下会拆分多个省/州级别的行,比如中国、美国、加拿大等国家都对应多条记录。 - pandas的
merge默认是内连接,当左表某国存在m条记录、右表同国存在n条记录时,会生成m*n条笛卡尔积结果,所有匹配的行两两组合,最终总行数就会远大于279。 - 你之前用
isin校验只能证明所有国家名称都存在,没法检查同一个国家对应的行数是否匹配,所以没发现重复问题。
解决方法
方法1:保留省/州维度合并(推荐,符合数据集原始设计)
这个数据集的唯一键是Province/State + Country/Region的组合,你合并时加上这个键即可得到正确的279行结果:
# 提取数据时保留Province/State字段 confirmed_cases = confirmed_df[["Province/State", "Country/Region","Lat","Long"]] death_cases = deaths_df[["Province/State", "Country/Region","8/8/21"]] # 用两个字段共同作为合并键 all_info = pd.merge(confirmed_cases, death_cases, on=["Province/State", "Country/Region"]) print(all_info.shape) # 输出为(279, 5),符合预期
如果不需要保留Province/State字段,合并后再删除即可。
方法2:按国家维度聚合后合并
如果你只需要国家级别的汇总数据,可以先按Country/Region聚合,再进行合并:
# 左表按国家聚合,经纬度取均值,也可以根据需求调整聚合逻辑 confirmed_agg = confirmed_cases.groupby("Country/Region", as_index=False).agg({"Lat": "mean", "Long": "mean"}) # 右表按国家聚合,死亡数求和 death_agg = death_cases.groupby("Country/Region", as_index=False)["8/8/21"].sum() # 合并聚合后的结果,行数和唯一国家数量一致 all_info = pd.merge(confirmed_agg, death_agg, on="Country/Region")
内容的提问来源于stack exchange,提问作者Hoàng Long
相关产品推荐
相关产品推荐

