使用来自一个 excel 的合并单元格添加 header 并插入到另一个 excel Pandas

Add header with merged cells from one excel and insert to another excel Pandas

我一直在搜索如何 ​​append/insert/concat 从一个 excel 到另一个但合并单元格的行。我找不到我要找的东西。

我需要得到的是:

并附加到第一行:

我尝试使用 pandas append() 但它破坏了列的排列。

df = pd.DataFrame()

for f in ['merge1.xlsx', 'test1.xlsx']:
    data = pd.read_excel(f, 'Sheet1')
    df = df.append(data)

df.to_excel('test3.xlsx')

有什么办法pandas可以做到吗?我只需要按字面意思将 header 插入第一行。

虽然我还在想办法,但是如果这个问题有重复的话其实对我来说没问题,只要我能找到答案或建议。

您可以使用 pd.read_excel 在工作簿中读取您想要的数据,在您的例子中是 'test1.xlsx'。然后,您可以利用 openpyxl.load_workbook() 打开带有 header 的现有工作簿,在您的例子中是 'merge1.xlsx'。最后,您可以使用新名称 ('test3.xlsx') 保存新工作簿,而无需更改现有的两个工作簿。

下面我提供了一个完全可重现的示例来说明如何执行此操作。为了使这个示例完全可重现,我创建了 'merge1.xlsx' 和 'test1.xlsx'。

请注意,如果在您的 'merge1.xlsx' 中,如果文件中只有您想要的 header 而没有其他内容,您可以使用我留下评论的两行在下面。这只会将您的数据从 'test1.xlsx' 附加到 'merge1.xlsx' 中的 header。如果是这种情况,那么您可以在最后摆脱这两个 for llops。否则,就像我的例子一样,它有点复杂。

在创建 'test3.xlsx' 时,我们遍历每一行并使用 len(df3.columns) 确定有多少列。在我的示例中,这等于二,但此代码也适用于更多的列。

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

df1 = pd.DataFrame()
writer = pd.ExcelWriter('merge1.xlsx') #xlsxwriter engine
df1.to_excel(writer, sheet_name='Sheet1')
ws = writer.sheets['Sheet1']
ws.merge_range('A1:C1', 'This is a merged cell')
ws.write('A3', 'some string I might not want in other workbooks')
writer.save()

df2 = pd.DataFrame({'col_1': [1,2,3,4,5,6], 'col_2': ['A','B','C','D','E','F']})
writer = pd.ExcelWriter('test1.xlsx')
df2.to_excel(writer, sheet_name='Sheet1')
writer.save()

df3 = pd.read_excel('test1.xlsx')
wb = load_workbook('merge1.xlsx')
ws = wb['Sheet1']
#for row in dataframe_to_rows(df3):
#    ws.append(row)
column = 2
for item in list(df3.columns.values):
    ws.cell(2, column=column).value = str(item)
    column = column + 1
for row_index, row in df3.iterrows():
    ws.cell(row=row_index+3, column=1).value = row_index #comment out to remove index
    for i in range(0, len(df3.columns)):
        ws.cell(row=row_index+3, column=i+2).value = row[i]

wb.save("test3.xlsx")

3 个工作簿的预期输出: