如何合并列数不同的两个Pandas DataFrame
解决DataFrame追加时行数据左对齐填充的问题
问题原因
使用pd.concat([header, detail], ignore_index=True)时,Pandas会按列名自动对齐数据。因为header的列是col_1/col_2/col_3,detail的列是col_4/col_5/col_6/col_7,合并后两行数据会分别占据各自的列区域,导致出现左右分栏空值的结果。
实现思路
要让detail的行数据直接追加到header下方并左对齐填充,需要:
- 先将
header扩展为包含所有原列(col_1到col_7)的DataFrame,缺失列补空值; - 将
detail的每一行数据提取出来,扩展到与所有原列长度一致(多余位置补空值),并映射到目标列; - 再将两个处理后的DataFrame合并。
修正后的代码
import pandas as pd # 读取原始数据 data = pd.read_excel('test.xlsx') header = data[['col_1', 'col_2', 'col_3']] detail = data[['col_4', 'col_5', 'col_6', 'col_7']] # 获取所有目标列(保持原Excel的列顺序) all_columns = data.columns.tolist() # 扩展header为包含所有列的结构,缺失列填充空值 header_expanded = header.reindex(columns=all_columns) # 处理detail:将每行数据扩展到所有列长度,左对齐填充 detail_expanded = [] for _, row in detail.iterrows(): # 提取当前行的所有值 row_values = row.tolist() # 补全到目标列的长度,后面的位置留空 row_values += [None] * (len(all_columns) - len(row_values)) detail_expanded.append(row_values) # 转换为DataFrame,指定列名 detail_expanded = pd.DataFrame(detail_expanded, columns=all_columns) # 合并两个DataFrame并重置索引 combined = pd.concat([header_expanded, detail_expanded], ignore_index=True) # 保存结果,不输出索引列 combined.to_csv('output.csv', index=False)
效果验证
运行后生成的output.csv会和预期一致:
| col_1 | col_2 | col_3 | col_4 | col_5 | col_6 | col_7 |
|---|---|---|---|---|---|---|
| aaaaa | bbbbb | ccccc | ||||
| ddddd | eeeee | fffff | ggggg |
内容的提问来源于stack exchange,提问作者bradsdb
相关产品推荐
相关产品推荐

