如何用Pandas合并维度不等的表格,替换首个表格的指定假值?
问题
我有两个Excel工作表,需要将第一个工作表中属于指定假值列表的值替换为第二个工作表中的对应值,且两个表格的维度可能不一致。示例如下:以'n'为键合并dc1和dc2得到dc_result或dc_result_2,相关数据及预期结果代码如下:
import pandas as pd import numpy as np dc1 = { 'n':[1, 2, 3, 4], 'a':[0, 5, 0.0, 'A'], 'b':[0,'', False, 'B', 'C'], } dc2 = { 'n':[1, 2, 3], 'a':[1, 0, 3], 'b':[6, 5, 8], 'c':[6, 5], } false_list = [False, 0, 0.0, 'Nan', np.nan, None, '','Null'] dc_result = { 'n':[1, 2, 3, 4], 'a':[1, 5, 3, 'A'], 'b':[6, 5, 8, 'B', 'C'], 'c':[6, 5], } # 或 dc_result_2 = { 'n':[1, 2, 3, 4, ''], 'a':[1, 5, 3, 'A', ''], 'b':[6, 5, 8, 'B', 'C'], 'c':[6, 5, '', '', ''], }
请问是否有基于Pandas的实现方法?
解决方案
可以用Pandas实现,核心思路是合并两个表后针对指定假值进行条件替换,同时处理维度不一致问题,以下是完整实现:
import pandas as pd import numpy as np # 1. 加载数据,Pandas自动处理维度不一致(缺失位置补NaN) dc1 = { 'n':[1, 2, 3, 4], 'a':[0, 5, 0.0, 'A'], 'b':[0,'', False, 'B', 'C'], } dc2 = { 'n':[1, 2, 3], 'a':[1, 0, 3], 'b':[6, 5, 8], 'c':[6, 5], } false_list = [False, 0, 0.0, 'Nan', np.nan, None, '','Null'] df1 = pd.DataFrame.from_dict(dc1) df2 = pd.DataFrame.from_dict(dc2) # 2. 以'n'为键外连接合并,保留所有行和列,用后缀区分同名列 merged_df = df1.merge(df2, how='outer', on='n', suffixes=('_x', '_y')) # 3. 对两个表共有的列进行假值替换 common_cols = [col for col in df1.columns if col != 'n' and col in df2.columns] for col in common_cols: # 判断df1的列值是否在假值列表中,是则用df2的对应值替换 merged_df[col] = np.where(merged_df[f'{col}_x'].isin(false_list), merged_df[f'{col}_y'], merged_df[f'{col}_x']) # 删除临时生成的后缀列 merged_df.drop([f'{col}_x', f'{col}_y'], axis=1, inplace=True) # 4. 生成两种预期结果格式 # dc_result格式:保留原始缺失值(NaN) dc_result = merged_df.to_dict('list') # dc_result_2格式:将所有缺失值替换为空字符串 merged_df_filled = merged_df.fillna('') dc_result_2 = merged_df_filled.to_dict('list') # 输出结果 print("dc_result:") print(dc_result) print("\ndc_result_2:") print(dc_result_2)
关键说明
- 维度不一致处理:
pd.DataFrame.from_dict会自动将长度不足的列用NaN补全,解决原始数据维度不匹配的问题。 - 表合并逻辑:使用
how='outer'的外连接,确保两个表的所有行和列都被保留,suffixes参数用来区分来自df1和df2的同名列。 - 假值替换:通过
np.where结合isin(false_list)实现条件替换,仅当df1中的值属于指定假值列表时,才用df2的对应值覆盖。 - 结果格式可选:提供两种输出格式,一种保留原始缺失值,另一种将缺失值转为空字符串,匹配题目中的两种预期结果。
内容的提问来源于stack exchange,提问作者Константин Прудников
相关产品推荐
相关产品推荐

