Pandas如何基于国家匹配从另一DataFrame提取年度排名新增列
解决方案
完全不需要手动遍历df1的国家,pandas内置的矢量化操作可以高效完成匹配,性能远高于自行循环遍历,以下是两种常用实现方案:
方法1:左连接合并(最推荐)
以df1为基准做左连接,仅匹配需要的年度排名字段即可,不会引入df2多余的国家数据:
import pandas as pd # 提前提取df2需要用到的两列,避免value、Average等同名字段冲突 df2_rank = df2[["Country", "Year Rank"]] # 左连接匹配,保留df1所有原有行 df1 = df1.merge(df2_rank, on="Country", how="left")
how="left"参数严格保证仅保留df1已有的11个国家,不会额外加入df2存在但df1没有的国家- 如果df2存在重复的Country记录,建议先去重再合并:
df2_unique = df2.drop_duplicates(subset="Country", keep="first") df2_rank = df2_unique[["Country", "Year Rank"]]
方法2:字典映射(保留原有行列顺序)
如果需要严格保留df1原有的列顺序、行顺序,也可以用映射实现:
# 将df2的国家-年度排名转为映射字典 rank_map = df2.set_index("Country")["Year Rank"].to_dict() # 直接新增列完成匹配 df1["Year Rank"] = df1["Country"].map(rank_map)
和左连接效果完全一致,适合对行列顺序有要求的场景。
不推荐的遍历实现(仅做参考)
如果你确实需要手动实现遍历逻辑,可以用iterrows遍历,但仅适合小数据量场景,数据量过大会有严重性能问题:
year_rank = [] for _, row in df1.iterrows(): match_res = df2.loc[df2["Country"] == row["Country"], "Year Rank"] year_rank.append(match_res.iloc[0] if not match_res.empty else pd.NA) df1["Year Rank"] = year_rank
内容的提问来源于stack exchange,提问作者Block65
相关产品推荐
相关产品推荐

