Çok sayfalı Excel elektronik tablosuna DataFrame listesini kaydedin


90

Bir DataFrame listesini bir Excel elektronik tablosuna nasıl aktarabilirim? Eyalet
için dokümanlar to_excel:

Notlar
Mevcut bir ExcelWriter nesnesini geçiriyorsanız, sayfa mevcut çalışma kitabına eklenecektir. Bu, farklı DataFrame'leri bir çalışma kitabına kaydetmek için kullanılabilir

writer = ExcelWriter('output.xlsx')
df1.to_excel(writer, 'sheet1')
df2.to_excel(writer, 'sheet2')
writer.save()

Bunu takiben, DataFrame'lerin bir listesini bir elektronik tabloya aşağıdaki gibi kaydeden bir işlev yazabileceğimi düşündüm:

from openpyxl.writer.excel import ExcelWriter
def save_xls(list_dfs, xls_path):
    writer = ExcelWriter(xls_path)
    for n, df in enumerate(list_dfs):
        df.to_excel(writer,'sheet%s' % n)
    writer.save()

Ancak (her biri to_excelayrı ayrı kaydedilebilen iki küçük DataFrame listesiyle ) bir istisna ortaya çıkar (Düzenleme: geri izleme kaldırıldı) :

AttributeError: 'str' object has no attribute 'worksheets'

Muhtemelen ExcelWriterdoğru aramıyorum , bunu yapmak için nasıl olmalıyım?

Yanıtlar:


137

Pandaların kendi ExcelWritersınıfını kullanmalısınız:

from pandas import ExcelWriter
# from pandas.io.parsers import ExcelWriter

Ardından save_xlsişlev beklendiği gibi çalışır:

def save_xls(list_dfs, xls_path):
    with ExcelWriter(xls_path) as writer:
        for n, df in enumerate(list_dfs):
            df.to_excel(writer,'sheet%s' % n)
        writer.save()

11
Bunun hızını nasıl buluyorsunuz? Dün aynı şeyi yapmaya çalıştım ve bir .xlsx dosyasına 2000 sütun içeren bir veri çerçevesi yazmanın katı hal sürücüsü olan iyi bir iş istasyonunda 100 satır başına yaklaşık 16 saniye sürdüğünü gördüm. İpython'da% prun ile bazı hızlı profilleme, bunun XML işlemeden kaynaklandığını gösterdi. Sonunda, ExcelWriter hızı engelleyici bir şekilde yavaş olduğu için, CSV üzerinden geçerek Excel'de veri elde ettim.
2013

6
2018'de hala yavaş.
stmax

2
Ayrıca ExcelWriterbir bağlam yöneticisi olarak da kullanabilirsiniz . with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
BallpointBen

2
Teşekkürler Andy. 'sheet%s' % nBiraz açıklayabilir misin lütfen? Ne işe yarar ve nasıl çalışır?
Bowen Liu

2
@BowenLiu Bu sadece sayfaları sayfa1,
sayfa2

18

Herhangi birinin bunun bir veri çerçevesi sözlüğü ile nasıl yapılacağına dair bir örneğe ihtiyacı olması durumunda:

from pandas import ExcelWriter

def save_xls(dict_df, path):
"""
Save a dictionary of dataframes to an excel file, with each dataframe as a seperate page
"""

    writer = ExcelWriter(path)
    for key in dict_df:
        dict_df[key].to_excel(writer, key)

    writer.save()

misal: save_xls(dict_df = my_dict, path = '~/my_path.xls')


Bu gerçekten günümü kurtardı. Ama işe yaramasına rağmen anlamadığım bir şey var. Bölüm ne yapıyor '%s' % key? Açıklayabilir misin? Teşekkürler!
Bowen Liu

Sözlük anahtar değerini alan ve bunu excel sayfasındaki sayfa adı için kullanan @BowenLiu. "% s", "anahtar" ile doldurulmuş bir yer tutucudur. Umarım yardımcı olur.
Jared Marks

0

Veri çerçevesinde bazı desteklemeyen karakter türleri varsa, bazen sorunlar olabilir (Unicode içeren bir excel dosyası yazmak). Üstesinden gelmek için aşağıdaki durumda olduğu gibi ' xlsxwriter ' paketini kullanabiliriz :

aşağıdaki kod için:

from pandas import ExcelWriter
import xlsxwriter
writer = ExcelWriter('notes.xlsx')
for key in dict_df:
        data[key].to_excel(writer, key,index=False)
writer.save()

Hatayı "IllegalCharacterError" olarak aldım

İşe yarayan kod:

%pip install xlsxwriter
from pandas import ExcelWriter
import xlsxwriter
writer = ExcelWriter('notes.xlsx')
for key in dict_df:
        data[key].to_excel(writer, key,index=False,engine='xlsxwriter')
writer.save()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.