如何使用第二个DataFrame作为值映射替换原DataFrame中的值
问题:基于映射DataFrame实现多列值替换
现有如下原始DataFrame:
import pandas as pd df = pd.DataFrame({ 'a': [1, 2, 3, 4], 'b': [1, 2, 3, 4] })
输出:
a b 0 1 1 1 2 2 2 3 3 3 4 4
需要基于以下映射DataFrame,对指定列执行值替换:
replace_value_map = pd.DataFrame({ 'column_to_map': ['a', 'a', 'b', 'b'], 'to_replace': [1, 2, 1, 3 ], 'replace_with': ['x', 'y', 'z', 'x'], })
输出:
column_to_map to_replace replace_with 0 a 1 x 1 a 2 y 2 b 1 z 3 b 3 x
替换规则:
- 列
a:将1替换为'x',2替换为'y' - 列
b:将1替换为'z',3替换为'x'
期望得到结果:
df_expected = pd.DataFrame({ 'a': ['x','y', 3, 4], 'b': ['z', 2,'x',4] })
输出:
a b 0 x z 1 y 2 2 3 x 3 4 4
解决方案
方法1:构造列级替换字典,使用DataFrame.replace()
先将映射DataFrame转换为嵌套字典(键为列名,值为该列的旧值-新值映射),再直接调用replace方法,该方法会自动匹配列和对应的替换规则:
# 构造替换字典结构:{列名: {旧值: 新值}} replace_dict = replace_value_map.groupby('column_to_map').apply( lambda x: dict(zip(x['to_replace'], x['replace_with'])) ).to_dict() # 执行替换 df_result = df.replace(replace_dict) print(df_result)
方法2:逐列单独处理映射
遍历目标列,针对每列筛选对应规则,使用Series.map()实现替换,同时用fillna保留未匹配的原始值:
df_result = df.copy() for col in df.columns: # 筛选当前列的映射规则 col_mapping = replace_value_map[replace_value_map['column_to_map'] == col] # 生成该列的替换字典 map_dict = dict(zip(col_mapping['to_replace'], col_mapping['replace_with'])) # 执行映射,未匹配值保持原样 df_result[col] = df_result[col].map(map_dict).fillna(df_result[col]) print(df_result)
方法3:使用apply批量处理列
结合apply方法和预先生成的替换字典,一次性完成所有列的替换:
# 生成列级替换字典 replace_dict = replace_value_map.groupby('column_to_map').apply( lambda x: dict(zip(x['to_replace'], x['replace_with'])) ).to_dict() # 对每列应用对应替换规则 df_result = df.apply(lambda series: series.map(replace_dict.get(series.name, {})).fillna(series)) print(df_result)
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

