Добавьте заголовок с объединенными ячейками из одного Excel и вставьте в другой Excel Pandas - PullRequest
0 голосов
/ 06 мая 2018

Я искал, как добавить / вставить / объединить строку из одного 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 голосов
/ 08 мая 2018

Вы можете использовать pd.read_excel для чтения в рабочей книге нужных вам данных, в вашем случае это «test1.xlsx». Затем вы можете использовать openpyxl.load_workbook(), чтобы открыть существующую книгу с заголовком, в вашем случае это «merge1.xlsx». Наконец, вы можете сохранить новый рабочий блок под новым именем ('test3.xlsx') без изменения двух существующих рабочих книг.

Ниже я привел полностью воспроизводимый пример того, как вы можете это сделать. Чтобы сделать этот пример полностью воспроизводимым, я создаю 'merge1.xlsx' и 'test1.xlsx'.

Обратите внимание, что если в вашем 'merge1.xlsx', если у вас есть только заголовок, который вы хотите, и ничего больше в файле, вы можете использовать две строки, которые я оставил закомментированными ниже. Это просто добавит ваши данные из «test1.xlsx» в заголовок «merge1.xlsx». Если это так, то вы можете избавиться от двух из-за ляпов в конце. В противном случае, как в моем примере, это немного сложнее.

При создании '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 рабочих книг:

Expected Output

...