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

如何用字典高效替换Pandas中某列的指定子集数据?

高效替换DataFrame指定列中匹配字典键的对应值

问题背景

有一个无NaN值的完整DataFrame,其中B列部分单元格数据错误。已准备好一个字典,键是A列的标识符,值是B列对应的正确数据。需要根据A列与字典键的匹配关系,仅替换B列对应单元格的值,其余数据保持不变。

示例代码

import pandas as pd

# 原始DataFrame
test_df = pd.DataFrame({
    'A' : [1,2,3,4], 
    'B' : ['one','two','c','d'],
    'C' : ['a','b','c','d']
})

# 校正字典:键是A列的标识符,值是B列的正确值
correction_dict = {
    3:'three',
    4:'four',
}

# 预期结果
wanted_result = pd.DataFrame({
    'A' : [1,2,3,4], 
    'B' : ['one', 'two','three','four'],
    'C' : ['a','b','c','d']
})

当前解法(效率瓶颈)

目前采用循环遍历字典的方式实现替换,但当字典规模较大或A列存在大量重复匹配键时,循环的执行效率很低:

def correct_df(dictionary, df):
    for k,v in dictionary.items():
        df.loc[df['A']==k, 'B'] = v
    return df

correct_df(correction_dict, test_df)

高效替代方案

方案1:map + fillna(最简洁)

利用Pandas的map方法将A列匹配字典键的值替换为对应正确值,不匹配的项会返回NaN,再用fillna保留B列原有的正确值:

test_df['B'] = test_df['A'].map(correction_dict).fillna(test_df['B'])

方案2:精准匹配后批量赋值(更高效)

先筛选出A列在字典键中的行,再对这些行的B列批量赋值,避免处理无关行:

# 生成匹配掩码
mask = test_df['A'].isin(correction_dict.keys())
# 对匹配行的B列批量替换
test_df.loc[mask, 'B'] = test_df.loc[mask, 'A'].map(correction_dict)

方案3:replace + combine_first

通过replace替换A列的匹配键,再用combine_first合并原B列的非匹配值,效果和方案1一致:

test_df['B'] = test_df['A'].replace(correction_dict).combine_first(test_df['B'])

以上三种方案均采用Pandas的矢量化操作,完全避免了Python层面的循环,在数据量较大时,执行效率会远高于循环遍历的方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:40:24