Вставьте столбец pandas Series или DataFrame в первый пустой столбец существующего файла Excel (с OpenPyXL?) - PullRequest
0 голосов
/ 09 апреля 2020

Я обрабатываю некоторые данные из файла Excel с библиотекой Python pandas и создаю два новых столбца из этих данных. Я хотел бы добавить эти столбцы справа от существующих в самом файле Excel, не вмешиваясь в уже имеющиеся данные. По этой причине я не могу использовать pd.to_excel(), потому что это перезаписывает существующие данные, и весь лист теряет свое форматирование.

Я смотрю в OpenPyXL для сохранения новых данных (не очень хорошо читать файл дважды, но обработка заголовков с помощью OpenPyXL и передача их в pandas выглядит немного беспорядочно). Проблема заключается в том, что функция ws.append() вставляет данные внизу первого столбца (столбец A), и я хочу сделать это вверху (строка 1) первого доступного свободного столбца (скажем, столбцы C и D например). В идеале это должно брать данные из двух объектов pandas Series (представляющих новые столбцы) или из объединенных столбцов всего pandas DataFrame, над которым я работаю. И желательно, чтобы скрипт автоматически обнаруживал первую пустую ячейку, хотя это не обязательно.

Есть идеи? Подобный вопрос был задан здесь , но там данные копируются с одного листа на другой, и я не могу заставить его работать.

Пример кода:

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
df = pd.read_excel("file.xlsx")
# New column:
df["Three"] = df["Two"].apply(lambda x: x**2)
# Saving:
file = load_workbook(filename="file.xlsx")
sheet = file["Sheet1"]
for row in dataframe_to_rows(df["Three"], index=False, header=True):
    sheet.append(row)
file.save("file.xlsx")

Пример файла Excel в виде DataFrame:

   One  Two
0    a    1
1    b    2
2    c    3

Насколько я понимаю, dataframe_to_rows() работает со всем DataFrame и не позволяет передавать в серию pandas или только один столбец из DataFrame. Вот почему приведенный выше код копирует весь DataFrame внизу файла Excel, где я просто хочу вставить столбец df["Three"] в столбец C Excel с заголовком.

EDIT: Я нашел способ сделать это (довольно уродливо, если вы спросите меня), но я был бы признателен, если бы кто-то был более интуитивно понятным и, скажем, pythoni c. Вот мой дубль:

sheet["C"]
for i, val in df["Three"].items():
    sheet["C{}".format(i+2)].value = val
sheet["C1"].value = df.columns[2]
file.save("test.xlsx")
...