合并DataFrame后,如何将指定列的指定值替换为同名列非指定值
Pandas实现指定值替换与合并的解决方案
需求概述
现有两个字典数据:
import pandas as pd dc1 = { 'n':[1, 2, 3, 4], 'a':[0, 2, 0.0, 4], 'b':[0,'', False, 5], } dc2 = { 'n':[1, 2, 3, 4], 'a':[1, 0, 3, 0.0], 'b':[6, 5, 8, 9], }
需要完成以下操作:
- 将字典转为DataFrame并按
n列合并 - 把df1中
a、b列的指定值([False, 0, 0.0, 'Nan', None, '', 'Null'])替换为df2对应列的数值 - 删除合并后多余的列,最终得到目标字典:
dc_result = { 'n':[1, 2, 3, 4], 'a':[1, 2, 3, 4], 'b':[6, 5, 8, 5], }
实现代码与解释
步骤1:转换并合并DataFrame
先将两个字典转为DataFrame,然后通过merge方法按n列做内连接,给df2的列添加后缀区分:
import pandas as pd # 定义原始字典 dc1 = { 'n':[1, 2, 3, 4], 'a':[0, 2, 0.0, 4], 'b':[0,'', False, 5], } dc2 = { 'n':[1, 2, 3, 4], 'a':[1, 0, 3, 0.0], 'b':[6, 5, 8, 9], } # 转换为DataFrame df1 = pd.DataFrame(dc1) df2 = pd.DataFrame(dc2) # 按n列合并,为dc2的列添加后缀 merged_df = pd.merge(df1, df2, on='n', suffixes=('', '_dc2'))
步骤2:替换指定值
先定义需要替换的数值集合(用集合查询效率更高),然后对a、b列批量处理:当df1的列值属于替换集合时,用df2对应列的值替换:
# 定义需要替换的目标值集合 replace_values = {False, 0, 0.0, 'Nan', None, '', 'Null'} # 批量处理a、b列 for col in ['a', 'b']: merged_df[col] = merged_df[col].mask(merged_df[col].isin(replace_values), merged_df[f'{col}_dc2'])
这里用mask方法可以简洁地实现“满足条件则替换”的逻辑,比apply更高效。
步骤3:清理列并转换为字典
删除合并后带后缀的多余列,再将结果DataFrame转换为字典格式:
# 删除dc2来源的列 merged_df = merged_df.drop(columns=['a_dc2', 'b_dc2']) # 转换为目标字典 dc_result = merged_df.to_dict('list') # 验证结果 print(dc_result)
运行以上代码后,输出结果完全匹配需求中的dc_result。
内容的提问来源于stack exchange,提问作者Константин Прудников
相关产品推荐
相关产品推荐

