You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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值,且合并流程存在漏洞。

解决方案

核心逻辑

  1. 以唯一键(如user)为基准,循环逐步合并Excel文件
  2. 针对合并后生成的_dupe后缀重复列,自定义函数处理值的合并规则
  3. 替换原列值后删除冗余的_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结构整洁

测试输出

针对示例数据,运行后输出如下:

userageteamname
12427
256yEugene
332zNaN
444NaNJeff
561NaNBritney

内容的提问来源于stack exchange,提问作者niebyl2002

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:10:24