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

基于Pandas的DataFrame匹配id字段添加描述列需求及代码咨询

问题分析与解决方案

首先,咱们先看看你原来代码的几个核心问题:

  • 嵌套循环生成的l1长度是20(F2的5行 × F1的4行),完全不匹配F1的4行数据;
  • 匹配成功时你添加的是整个F2的Description列,而不是当前匹配行的单个描述值;
  • 没有处理数据里的字符串'NaN',会导致无效的匹配(比如两个'NaN'被误判为相等);
  • 硬编码length=4,代码完全不灵活,F1行数一变就失效。

接下来我给你两种解决方案,一种是更易理解的循环映射法,另一种是更符合Pandas风格的合并法。


方案1:映射字典 + 逐行匹配(易理解)

这个方法先把F2里所有有效的id(id1/id2)和对应的Description做成映射,再给F1逐行匹配:

import pandas as pd

# 原始数据
F1 = {'id1': ['x22', 'x13','NaN','x421'],'id2':['NaN',223,788,'NaN']}
F1 = pd.DataFrame(data=F1)
F2 = {'id1': ['x22', 'NaN','NaN','x413','x421'],'id2':['NaN','223','788','NaN','233'],'Description':['California','LA','NY','Havnover','Munich']}
F2 = pd.DataFrame(data=F2)

# 第一步:把字符串'NaN'转换成真正的缺失值,方便后续判断
F1 = F1.replace('NaN', pd.NA)
F2 = F2.replace('NaN', pd.NA)

# 第二步:构建id到Description的映射字典
id_desc_map = {}
for _, row in F2.iterrows():
    # 处理id1(非空才加入映射)
    if pd.notna(row['id1']):
        id_desc_map[row['id1']] = row['Description']
    # 处理id2:注意F2的id2是字符串,F1的id2是整数,统一转成字符串避免类型不匹配
    if pd.notna(row['id2']):
        id_desc_map[str(row['id2'])] = row['Description']

# 第三步:给F1添加Description列
def get_desc(row):
    # 先检查id1是否在映射里
    if pd.notna(row['id1']) and row['id1'] in id_desc_map:
        return id_desc_map[row['id1']]
    # 再检查id2(转成字符串后)是否在映射里
    if pd.notna(row['id2']) and str(row['id2']) in id_desc_map:
        return id_desc_map[str(row['id2'])]
    # 都不匹配返回'Null'
    return 'Null'

F1['Description'] = F1.apply(get_desc, axis=1)
print(F1)

运行后输出的F1就是你要的结果:

id1   id2  Description
0   x22  <NA>  California
1   x13   223           LA
2  <NA>   788           NY
3  x421  <NA>        Munich

方案2:Pandas合并法(更简洁高效)

如果熟悉Pandas的合并操作,用merge可以更简洁地实现需求,避免手动循环:

import pandas as pd

# 原始数据(同方案1)
F1 = {'id1': ['x22', 'x13','NaN','x421'],'id2':['NaN',223,788,'NaN']}
F1 = pd.DataFrame(data=F1)
F2 = {'id1': ['x22', 'NaN','NaN','x413','x421'],'id2':['NaN','223','788','NaN','233'],'Description':['California','LA','NY','Havnover','Munich']}
F2 = pd.DataFrame(data=F2)

# 处理字符串'NaN'为缺失值
F1 = F1.replace('NaN', pd.NA)
F2 = F2.replace('NaN', pd.NA)

# 先按id1合并,获取匹配的Description
merge_id1 = F1.merge(F2[['id1', 'Description']], on='id1', how='left')
# 再按id2合并(注意统一类型)
merge_id2 = F1.merge(F2[['id2', 'Description']], left_on='id2', right_on='id2', how='left', suffixes=('', '_id2'))

# 合并两个结果,优先取id1匹配的,没有则取id2匹配的,最后填充'Null'
F1['Description'] = merge_id1['Description'].combine_first(merge_id2['Description_id2']).fillna('Null')
print(F1)

这个方法和方案1的结果完全一致,但更符合Pandas的向量化操作风格,数据量大的时候效率更高。


内容的提问来源于stack exchange,提问作者This

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:54:10