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

无主键DataFrame合并/拼接问题:实现多表数据统一整合

问题描述

现有两个结构相近但无关联主键的DataFrame:

第一个DataFrame:

Name    Middle Name Last Name
0   Ambar   Klein       Liam
1   Maya    J           Jacobson
2   Steve   Knowles     Gomez
3   Sam l   Smith       NaN
4   Gomez   John        Smith
5   Mical   M           Mason

第二个DataFrame:

Name    Last Name
0   Smith   Klein
1   Sams    Peter
2   Betts   Knowles

需求是将两者合并为单个DataFrame,无需切换操作。但使用以下代码拼接后,出现部分列丢失、其中一个表的表头被转为数据行的问题:

原错误代码

test_li = []

for test_filename in test:
    test_df = pd.read_excel(test_filename, index_col=None, header=None)
    test_li.append(test_df)

test_frame = (
            pd.concat(test_li , axis=0, ignore_index=True)
                .dropna(how="all") # 移除表头上方的空行
                .drop_duplicates() # 移除重复表头
                .T.set_index(0).T # 将第一行设为表头
        )
test_frame = test_frame.loc[:,test_frame.columns.notnull()]
test_frame

错误输出

Name    Middle Name Last Name
1   Ambar   Klein       Liam
2   Maya    J           Jacobson
3   Steve   Knowles     Gomez
4   Sam l   Smith       NaN
5   Gomez   John        Smith
6   Mical   M           Mason
12  NaN     NaN         t
13  Name    Last Name   NaN
14  Smith   Klein       NaN
15  Sams    Peter       NaN
16  Betts   Knowles     NaN

期望得到包含所有列的统一结构,输出如下:

Name    Middle Name Last Name
0   Ambar   Klein       Liam
1   Maya    J           Jacobson
2   Steve   Knowles     Gomez
3   Sam l   Smith       -
4   Gomez   John        Smith
5   Mical   M           Mason
6   Smith   -           Klein
7   Sams    -           Peter
8   Betts   -           Knowles
解决方案

核心思路是分别读取每个文件并保留原表头,统一列结构后再拼接,避免将表头误解析为数据行。

完整代码

import pandas as pd

test_li = []
# 遍历目标Excel文件列表
for test_filename in test:
    # 正常读取文件,保留第一行为表头
    df = pd.read_excel(test_filename, index_col=None)
    # 检查并补充缺失的列,填充默认值
    if 'Middle Name' not in df.columns:
        df['Middle Name'] = '-'
    # 统一列顺序,确保和第一个表一致
    df = df[['Name', 'Middle Name', 'Last Name']]
    test_li.append(df)

# 拼接所有DataFrame并重置索引
test_frame = pd.concat(test_li, axis=0, ignore_index=True)
# 可选:将所有空值替换为'-'
test_frame = test_frame.fillna('-')

print(test_frame)

关键说明

  • 读取文件时不要设置header=None,避免把表头当成数据行处理;
  • 主动检查并补充缺失列,保证两个DataFrame的列结构完全匹配;
  • 拼接时用ignore_index=True重置索引,生成连续的行号;
  • 若不需要将空值替换为-,可去掉最后一行fillna代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:32:20