无主键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
相关产品推荐
相关产品推荐

