You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:48:00