合并同结构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把它们当成了不同列,才出现错位。给你几个具体的解决方向:
先检查列名是否一致
在循环里加一行打印列名的代码,看看两个文件读取后的列是不是完全一样:print(df.columns.tolist())如果发现列名有差异(比如一个是
'Data1',另一个是' Data1'带空格),就统一处理列名:df.columns = df.columns.str.strip() # 去掉列名前后的空格 # 或者直接手动指定正确列名,确保两个df列名完全一致 df.columns = ['Date', 'Data1', 'Data2']确认读取的列范围是否正确
你用了usecols='O:AN'指定列范围,会不会第二个文件的实际数据列位置和第一个有差异?比如有隐藏列或者格式微调,导致读取的列对应错了。可以先尝试去掉usecols参数,读取整个sheet看看结构,再确认列范围是否准确。优化concat的用法
显式指定按列名匹配合并,加上join='inner'只保留共同列,避免不匹配的列干扰:combined_df = pd.concat(data_frames, ignore_index=True, join='inner')把合并操作移出循环
你的代码现在每次循环都执行合并并保存,不仅效率低,还可能引入中间错误。应该先把所有文件都读取到列表里,最后再一次性合并: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
相关产品推荐
相关产品推荐

