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

合并同结构3列DataFrame后出现列错位的问题求助

合并同结构3列DataFrame后出现列错位的问题求助

我现在碰到了一个Excel文件合并的问题,想请大家帮忙找找问题出在哪:

我的需求

我有两个结构完全一致的Excel文件:

  • Excel文件#1:
Date      Data1   Data2
1-1-2025   x1       x2
1-2-2025   x3       x4
  • Excel文件#2:
Date      Data1   Data2
1-3-2025   y1       y2
1-4-2025   y3       y4

我想要把它们合并成一个包含所有行的单一文件,期望的结果是:

Date      Data1   Data2
1-1-2025   x1       x2
1-2-2025   x3       x4
1-3-2025   y1       y2
1-4-2025   y3       y4

我的代码

for file_path in file_paths:
    # Get the date from the file name
    file_name = file_path
    file_name = os.path.splitext(file_name)[0]
    file_name = file_name[-8:]
    file_name = file_name.replace('_','/')
    # Read the Excel file
    df = pd.read_excel(file_path, sheet_name='Parte', usecols='O:AN', skiprows=10, nrows=110, header=[0])
    data_frames.append(df)
    combined_df = pd.concat(data_frames, ignore_index=True)
    combined_df.to_excel('rute1', index=False)

实际得到的错误结果

Date      Data1   Data2
1-1-2025   x1       x2
1-2-2025   x3       x4
1-3-2025                          y1       y2
1-4-2025                          y3       y4

我的排查和解决思路

看起来核心问题大概率是两个读取后的DataFrame列名不匹配——虽然你说文件结构相同,但实际读取时可能因为列名带空格、隐藏字符,或者读取的列范围对应错误,导致pd.concat把它们当成了不同列,才出现错位。给你几个具体的解决方向:

  1. 先检查列名是否一致
    在循环里加一行打印列名的代码,看看两个文件读取后的列是不是完全一样:

    print(df.columns.tolist())
    

    如果发现列名有差异(比如一个是'Data1',另一个是' Data1'带空格),就统一处理列名:

    df.columns = df.columns.str.strip()  # 去掉列名前后的空格
    # 或者直接手动指定正确列名,确保两个df列名完全一致
    df.columns = ['Date', 'Data1', 'Data2']
    
  2. 确认读取的列范围是否正确
    你用了usecols='O:AN'指定列范围,会不会第二个文件的实际数据列位置和第一个有差异?比如有隐藏列或者格式微调,导致读取的列对应错了。可以先尝试去掉usecols参数,读取整个sheet看看结构,再确认列范围是否准确。

  3. 优化concat的用法
    显式指定按列名匹配合并,加上join='inner'只保留共同列,避免不匹配的列干扰:

    combined_df = pd.concat(data_frames, ignore_index=True, join='inner')
    
  4. 把合并操作移出循环
    你的代码现在每次循环都执行合并并保存,不仅效率低,还可能引入中间错误。应该先把所有文件都读取到列表里,最后再一次性合并:

    data_frames = []
    for file_path in file_paths:
        # 文件名处理代码不变
        file_name = file_path
        file_name = os.path.splitext(file_name)[0]
        file_name = file_name[-8:]
        file_name = file_name.replace('_','/')
        # 读取文件并处理列名
        df = pd.read_excel(file_path, sheet_name='Parte', usecols='O:AN', skiprows=10, nrows=110, header=[0])
        df.columns = df.columns.str.strip()  # 统一列名
        data_frames.append(df)
    # 所有文件读取完成后再合并
    combined_df = pd.concat(data_frames, ignore_index=True, join='inner')
    combined_df.to_excel('rute1', index=False)
    

你可以先试试打印列名,这是最容易排查的点哦!

备注:内容来源于stack exchange,提问作者Rod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:19:32