如何在Pandas中用另一DataFrame的值替换指定列内容?
解决DataFrame列值匹配替换问题
核心思路
利用pandas的字典映射实现高效匹配替换:先将映射表(df2)转换为原始编码:新编码的字典,再用Series.map()方法快速替换目标DataFrame(df1)指定列的数值。这种方法比合并(merge)更高效,尤其适合df1行数远大于df2的场景。
基础实现代码
import pandas as pd # 构建示例数据 df1 = pd.DataFrame({ 'Postcode': ['BS105JJ', 'BS105JL', 'BS105JN', 'BS105JP', 'BS105JR', 'BS105JS', 'BS105JT'], 'Column 2': [1, 0, 1, 0, 1, 0, 1], 'Column 3': [3, 0, 2, 0, 1, 0, 5], 'Column 4': [0, 0, 0, 0, 0, 0, 0], 'Column 5': [1, 1, 1, 1, 1, 1, 1] }) df2 = pd.DataFrame({ 'Code': [0, 1, 2, 3, 4, 5], 'Code New': [1, 3, 5, 7, 9, 3] }) # 生成编码映射字典 code_mapping = df2.set_index('Code')['Code New'].to_dict() # 替换df1的Column 2列 df1['Column 2'] = df1['Column 2'].map(code_mapping) # 输出结果 print(df1)
执行后输出与预期结果完全一致:
Postcode Column 2 Column 3 Column 4 Column 5 0 BS105JJ 3 3 0 1 1 BS105JL 1 0 0 1 2 BS105JN 3 2 0 1 3 BS105JP 1 0 0 1 4 BS105JR 3 1 0 1 5 BS105JS 1 0 0 1 6 BS105JT 3 5 0 1
可复用函数封装
如果需要对不同列、不同映射表重复执行替换,可封装成通用函数:
def replace_column_values(df_target, target_col, df_mapping, mapping_old_col, mapping_new_col): """ 替换DataFrame指定列的数值 :param df_target: 需要修改的目标DataFrame :param target_col: 目标列名 :param df_mapping: 映射关系DataFrame :param mapping_old_col: 映射表中原始编码的列名 :param mapping_new_col: 映射表中新编码的列名 :return: 修改后的DataFrame """ # 构建映射字典 mapping_dict = df_mapping.set_index(mapping_old_col)[mapping_new_col].to_dict() # 替换目标列,若原始值不在映射中则保留原数值 df_target[target_col] = df_target[target_col].map(lambda x: mapping_dict.get(x, x)) return df_target # 使用示例:替换df1的Column 3列(假设用同一映射表) df1_updated = replace_column_values(df1, 'Column 3', df2, 'Code', 'Code New')
注意事项
- 若目标列存在映射表中没有的编码,
map()默认返回NaN;函数中用mapping_dict.get(x, x)可保留原数值,避免缺失值。 - 字典映射的时间复杂度为O(n),处理百万级行数的df1也能保持高效。
内容的提问来源于stack exchange,提问作者Danylo
相关产品推荐
相关产品推荐

