quinnvdk Ответов: 1

Запись данных в существующий excel без замены предыдущих данных


В настоящее время я экспортирую два фрейма данных в один файл excel. Каждый фрейм данных размещается на отдельных листах. В настоящее время я запускаю симуляцию, и мне нужно 2000 столбцов каждого фрейма данных (2000 на каждом листе). Каждый раз, когда я запускаю свой код, он создает новый файл excel (то, что я изначально намеревался). Но чтобы сэкономить время, мне было интересно, можно ли записать в существующий файл excel, добавив новые столбцы данных, не записывая поверх существующих данных?
######### This is my original code ################
    import pandas as pd
    from pandas import ExcelWriter
    from pandas import ExcelFile
    from pandas import DataFrame
    from openpyxl import Workbook
    
    df1 = pd.DataFrame(returns1)
    df2 = pd.DataFrame(returns2)
    
    
    x1 = 'mypath/ '
    x2 = datetime.datetime.now().strftime('%B %d, %Y %H-%M-%S')
    x3 = '.xlsx'
    destination = x1 + x2 + x3
    writer = pd.ExcelWriter(destination, engine='xlsxwriter')
    
    df1.to_excel(writer, sheet_name= 'Returns 1', index=False)
    df2.to_excel(writer, sheet_name= 'Returns 2', index=False)
    writer.save()


Что я уже пробовал:

############ Update ##############

Got it to work! This is the final code! Does exactly what I wanted. I hope this will help others who run into the same problem I was having. 
    
    df1 = pd.DataFrame(returns1)
    df2 = pd.DataFrame(returns2)
    
    book = load_workbook('mypath.xlsx')
    writer = pd.ExcelWriter('mypath.xlsx', engine='openpyxl')
    writer.book = book
    writer.sheets = {ws.title: ws for ws in book.worksheets}
    

    df1.to_excel(writer, sheet_name='Returns1', startrow=0, startcol=writer.sheets['Returns1'].max_column, index=False)
    df2.to_excel(writer, sheet_name='Returns2', startrow=0, startcol=writer.sheets['Returns2'].max_column, index=False)


This is what I wanted the code to do... 
 A
100
120
119
225

Second Time
 A     B
100    98
120   100
119   105
125   111

Third Time
 A     B     C
100    98    106 
120   100    99
119   105    101
125   111    89
и так далее...

Richard MacCutchan

Вам нужен метод в библиотеке Excel, который найдет для вас первый пустой столбец. Хотя, глядя на ваши примеры выше, у меня складывается впечатление, что вы пытаетесь добавить строки, а не столбцы.

quinnvdk

Есть ли синтаксис python, который позволяет мне найти следующий пустой столбец? И нет, я ищу колонки. Я просто отредактировал вопрос, чтобы отразить добавление столбцов, мои извинения.

1 Ответов

Рейтинг:
6

CHill60

Вы можете получить последнюю строку (или последний столбец не используется) max_row (или max_col) например (NB непроверенные)

wb = openpyxl.load_workbook('mypath.xlsx')
ws = wb.active

mr = ws.max_row
mc = ws.max_column
MaxU предоставил вспомогательную функцию для этого в Добавьте существующий лист excel с новым фреймом данных с помощью python pandas[^]


quinnvdk

@CHill60 можно ли показать, как я буду реализовывать это в своем коде? Я пытался использовать пример из MaxU, и никакие данные не были записаны в файл excel.

CHill60

Я в замешательстве - вы опубликовали код для его реализации в своей последней версии поста. Здесь вы говорите, что никакие данные не записываются в файл, но в вашем исправленном сообщении вы говорите, что данные дублируются. Если вы дублируете столбцы, попробуйте использовать header=none (как предложил Максу)

quinnvdk

Извините за путаницу. Я опубликовал это обновление после того, как ответил на ваш комментарий. Теперь код записывается в файл excel. Но по какой-то странной причине он записывает вывод дважды (пример.... Первый раз: тот же вывод в колонках а и В. второй раз: тот же вывод в колонках С и D).

Maciej Los

5ed!

CHill60

Спасибо! Я сам только начал использовать Python, поэтому был очень доволен, когда узнал решение этой проблемы (хотя все еще гуглил его, чтобы проверить свой ответ :-) )

Maciej Los

:большой палец вверх: