如何将一个pandas DataFrame插入另一个DataFrame实现汇总拼接
可行实现方案
常规的append、merge、concat默认会按列名对齐字段,自然会把两个表不同的列名拆成新列,不符合你要的上下堆叠汇总的需求。你要的效果本质是不做列对齐,把每个表的列名当成普通首行,表之间插空行后纵向拼接即可,直接用下面的代码就能实现:
第一步:准备示例数据(你可以替换成自己的真实数据)
import pandas as pd import numpy as np df1 = pd.DataFrame({ 'col1': [45], 'col2': [69], 'col3': ['string'], 'col4': ['string'] }) df2 = pd.DataFrame({ 'col5': [45, 'data'], 'col8': [37, 'random'] })
第二步:核心拼接函数
def stack_df_blocks(*input_dfs, blank_line_num=2): block_list = [] for i, df in enumerate(input_dfs): # 将原表列名转为第一行数据 col_row = pd.DataFrame([df.columns], columns=df.columns) # 合并列名行和原数据行 df_block = pd.concat([col_row, df], ignore_index=True).values block_list.append(df_block) # 非最后一个表的话,插入指定数量的空行 if i != len(input_dfs) - 1: blank_rows = np.full((blank_line_num, df.shape[1]), '', dtype=object) block_list.append(blank_rows) # 不同表列数不一致时,按最大列数补空对齐,避免拼接报错 max_col_count = max(block.shape[1] for block in block_list) padded_blocks = [] for block in block_list: if block.shape[1] < max_col_count: pad_part = np.full((block.shape[0], max_col_count - block.shape[1]), '', dtype=object) block = np.concatenate([block, pad_part], axis=1) padded_blocks.append(block) # 生成最终无列名的汇总DataFrame res = pd.DataFrame(np.concatenate(padded_blocks, axis=0)) return res
调用方法
final_df = stack_df_blocks(df1, df2, blank_line_num=2) # 打印时去掉索引和默认表头,完全匹配你要的展示效果 print(final_df.to_string(index=False, header=False))
输出结果
col1 col2 col3 col4 45 69 string string col5 col8 45 37 data random
如果需要调整两个表之间的空行数量,直接修改blank_line_num参数即可,函数也支持同时传入2个以上的DataFrame做同样的堆叠汇总。
内容的提问来源于stack exchange,提问作者Frank Shrestha
相关产品推荐
相关产品推荐

