添加包含来自一个excel的合并单元格的标题,然后插入另一个excel Pandas

时间:2018-05-06 17:56:59

标签: python excel pandas openpyxl

我一直在搜索如何从一个excel追加/插入/连接一行但是使用合并的单元格。我无法找到我要找的东西。

我需要得到的是: enter image description here

并附加到第一行: enter image description here

我尝试使用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')

大熊猫有没有办法做到这一点?我只需要将标题插入顶行。

虽然我仍然想找到一种方法,但如果这个问题有重复,只要我能找到答案或建议,对我来说实际上是好的。

1 个答案:

答案 0 :(得分:3)

您可以使用pd.read_excel在工作簿中读取您想要的数据,例如“test1.xlsx”。然后,您可以使用openpyxl.load_workbook()打开包含标题的现有工作簿,在您的情况下是'merge1.xlsx'。最后,您可以使用新名称('test3.xlsx')保存新的workbbok,而无需更改现有的两个工作簿。

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

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

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

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本工作簿的预期输出:

Expected Output