บันทึกรายการ DataFrames ลงในสเปรดชีต Excel หลายแผ่น


90

ฉันจะส่งออกรายการ DataFrames ไปยังสเปรดชีต Excel เดียวได้อย่างไร
เอกสารสำหรับto_excelรัฐ:

หมายเหตุ
หากส่งผ่านวัตถุ ExcelWriter ที่มีอยู่แผ่นงานจะถูกเพิ่มลงในสมุดงานที่มีอยู่ สามารถใช้เพื่อบันทึก DataFrames ต่างๆลงในสมุดงานเดียว

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

จากนี้ฉันคิดว่าฉันสามารถเขียนฟังก์ชันที่บันทึกรายการ DataFrames ลงในสเปรดชีตเดียวได้ดังนี้:

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

อย่างไรก็ตาม (ด้วยรายการ DataFrames ขนาดเล็กสองรายการซึ่งแต่ละรายการสามารถบันทึกto_excelแยกกันได้) จะมีการเพิ่มข้อยกเว้น(แก้ไข: การย้อนกลับที่ลบออก) :

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

คงจะโทรไม่ExcelWriterถูกต้องทำอย่างไรจึงจะทำเช่นนี้ได้

คำตอบ:


137

คุณควรใช้ExcelWriterคลาสของแพนด้าเอง:

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

จากนั้นsave_xlsฟังก์ชันจะทำงานตามที่คาดไว้:

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
คุณหาความเร็วของสิ่งนี้ได้อย่างไร? ฉันพยายามทำสิ่งเดียวกันเมื่อวานนี้และพบว่าการเขียนดาต้าเฟรมที่มี 2,000 คอลัมน์ไปยังไฟล์. xlsx นั้นใช้เวลาประมาณ 16 วินาทีต่อ 100 แถวบนเวิร์กสเตชันที่เหมาะสมพร้อมไดรฟ์โซลิดสเตต การทำโปรไฟล์อย่างรวดเร็วบางอย่างด้วย% prun ใน ipython แสดงให้เห็นว่าเกิดจากการประมวลผล XML ในที่สุดฉันก็ได้ข้อมูลระหว่าง Excel โดยไปที่ CSV เนื่องจากความเร็วของ ExcelWriter นั้นช้ามาก
snth

6
ยังคงช้าเหมือนเดิมในปี 2018
stmax

2
คุณยังสามารถใช้ExcelWriterเป็นตัวจัดการบริบท with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
BallpointBen

2
ขอบคุณแอนดี้ ช่วยอธิบาย'sheet%s' % nหน่อยได้ไหม มันทำอะไรและทำงานอย่างไร?
Bowen Liu

2
@BowenLiu นั่นเป็นเพียงการตั้งชื่อชีตเป็น sheet1, sheet2 เป็นต้น
xiaomy

18

ในกรณีที่ใครก็ตามต้องการตัวอย่างวิธีการใช้พจนานุกรมดาต้าเฟรม:

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

ตัวอย่าง: save_xls(dict_df = my_dict, path = '~/my_path.xls')


นี่ช่วยชีวิตฉันได้จริงๆ แต่มีสิ่งหนึ่งที่ฉันไม่เข้าใจแม้ว่ามันจะได้ผล ส่วนนี้'%s' % keyทำหน้าที่อะไร? คุณช่วยอธิบายได้ไหม ขอบคุณ!
Bowen Liu

@BowenLiu ที่ใช้ค่าคีย์พจนานุกรมและใช้สำหรับชื่อเพจในแผ่นงาน excel "% s" คือตัวยึดตำแหน่งที่เต็มไปด้วย "คีย์" หวังว่าจะช่วยได้
Jared Marks

0

บางครั้งอาจมีปัญหา (การเขียนไฟล์ excel ที่มี Unicode) หากมีประเภทอักขระที่ไม่สนับสนุนในกรอบข้อมูล เพื่อเอาชนะมันเราสามารถใช้แพ็คเกจ ' xlsxwriter ' ในกรณีด้านล่าง:

สำหรับรหัสด้านล่าง:

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

ฉันได้รับข้อผิดพลาดเป็น "IllegalCharacterError"

รหัสที่ใช้งานได้:

%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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.