Lưu danh sách DataFrames vào bảng tính Excel nhiều bảng


89

Làm cách nào để xuất danh sách DataFrames thành một bảng tính Excel?
Các tài liệu cho to_exceltiểu bang:

Ghi chú
Nếu truyền một đối tượng ExcelWriter hiện có, thì trang tính sẽ được thêm vào sổ làm việc hiện có. Điều này có thể được sử dụng để lưu các DataFrames khác nhau vào một sổ làm việc

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

Sau đó, tôi nghĩ rằng tôi có thể viết một hàm lưu danh sách các DataFrame vào một bảng tính như sau:

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()

Tuy nhiên (với danh sách hai DataFrame nhỏ, mỗi DataFrame có thể lưu to_excelriêng lẻ), một ngoại lệ được đưa ra (Chỉnh sửa: đã loại bỏ dấu vết) :

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

Có lẽ tôi đang gọi không ExcelWriterchính xác, tôi phải làm thế nào để thực hiện việc này?

Câu trả lời:


135

Bạn nên sử dụng ExcelWriterlớp riêng của gấu trúc :

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

Sau đó, save_xlschức năng hoạt động như mong đợi:

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
Làm thế nào bạn tìm thấy tốc độ của điều này? Tôi đã cố gắng làm điều tương tự ngày hôm qua và nhận thấy rằng việc ghi một khung dữ liệu với 2000 cột vào tệp .xlsx mất khoảng 16 giây trên 100 hàng trên một máy trạm ổn định có ổ đĩa trạng thái rắn. Một số cấu hình nhanh với% prun trong ipython cho thấy điều này là do xử lý XML. Cuối cùng, tôi đã nhận được dữ liệu trong Excel bằng cách đi qua CSV vì tốc độ ExcelWriter rất chậm.
thứ chín

6
Vẫn chậm như năm 2018
stmax 19/02/18

2
Bạn cũng có thể sử dụng ExcelWriterlàm trình quản lý ngữ cảnh. with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
BallpointBen

2
Cảm ơn Andy. Bạn 'sheet%s' % nvui lòng giải thích một chút được không? Nó làm gì và hoạt động như thế nào?
Bowen Liu

2
@BowenLiu Đó chỉ là đặt tên các trang tính thành sheet1, sheet2, v.v.
xiaomy

17

Trong trường hợp có ai đó cần một ví dụ về cách thực hiện việc này với từ điển khung dữ liệu:

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()

thí dụ: save_xls(dict_df = my_dict, path = '~/my_path.xls')


Điều này thực sự đã cứu ngày của tôi. Nhưng có một điều tôi không hiểu mặc dù nó đã hoạt động. Bộ phận '%s' % keylàm gì? Bạn có vui lòng giải thích nó không? Cảm ơn!
Bowen Liu

@BowenLiu lấy giá trị khóa từ điển và sử dụng nó cho tên trang trong trang tính excel. '% s' là trình giữ chỗ được điền bằng "khóa". Hy vọng rằng sẽ giúp.
Jared Marks
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.