Python合并DataFrame:保留不同单元格值并合并重复列
多维度Excel文件合并的列值处理方案
需求说明
合并多个列结构不同的Excel文件时,针对重复列的单元格值需按以下规则处理:
- 两个值相同:保留单一值
- 其中一个为NaN:保留非空值
- 两个值不同:用
||拼接,留待人工核查
输入示例数据
import pandas as pd import numpy as np df = pd.DataFrame({'user': ['1', '2', '3'], 'age': [24,56,32], 'team': ['x','y','z']}) df1 = pd.DataFrame({'user': ['1','2','4','5'], 'age': [27,np.nan,44,61], 'name': ['Ronald','Eugene','Jeff','Britney']})
现有代码问题
原代码使用str.cat()处理重复列时,无法正确覆盖三种场景的逻辑,导致合并后出现NaN值,且合并流程存在漏洞。
解决方案
核心逻辑
- 以唯一键(如
user)为基准,循环逐步合并Excel文件 - 针对合并后生成的
_dupe后缀重复列,自定义函数处理值的合并规则 - 替换原列值后删除冗余的
_dupe列
完整代码实现
import pandas as pd import numpy as np # 替换为你的实际文件路径和列表 FILELIST = ["file1.xlsx", "file2.xlsx"] FILEPATH_INPUT = "./" UNIQUE_KEY = "user" JOIN_METHOD = "outer" # 根据需求选择inner/outer def merge_column_values(original_val, dupe_val): # 处理值相同的情况 if original_val == dupe_val: return original_val # 处理其中一个为NaN的情况 if pd.isna(original_val): return dupe_val if pd.isna(dupe_val): return original_val # 处理值不同的情况 return f"{original_val}||{dupe_val}" df = pd.DataFrame() for excel_files in FILELIST: if excel_files.endswith(".xlsx"): df1 = pd.read_excel(FILEPATH_INPUT + excel_files, dtype=str) print(f"正在处理文件:{excel_files}") if df.empty: df = df1.copy() else: # 合并数据,生成带_dupe后缀的重复列 merged_df = pd.merge(df, df1, on=UNIQUE_KEY, how=JOIN_METHOD, suffixes=('', '_dupe')) # 遍历处理所有重复列 for col in merged_df.columns: if "_dupe" in col: original_col = col.replace("_dupe", "") # 逐行应用合并规则 merged_df[original_col] = merged_df.apply( lambda row: merge_column_values(row[original_col], row[col]), axis=1 ) # 删除冗余的_dupe列 merged_df.drop(col, axis=1, inplace=True) # 更新主DataFrame df = merged_df.copy() print("\n合并结果:") print(df)
代码说明
merge_column_values函数:精准覆盖三种合并场景,逻辑清晰无遗漏- 使用
apply(axis=1)逐行处理,避免str.cat()无法处理NaN的问题 - 每次合并后即时清理冗余列,保持DataFrame结构整洁
测试输出
针对示例数据,运行后输出如下:
| user | age | team | name |
|---|---|---|---|
| 1 | 24 | 27 | |
| 2 | 56 | y | Eugene |
| 3 | 32 | z | NaN |
| 4 | 44 | NaN | Jeff |
| 5 | 61 | NaN | Britney |
内容的提问来源于stack exchange,提问作者niebyl2002
相关产品推荐
相关产品推荐

