如何用字典高效替换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
相关产品推荐
相关产品推荐

