एक्सेल स्प्रेडशीट को मल्टीफ़्रेस करने के लिए डेटाफ़्रेम की सूची सहेजें


91

मैं एक एक्सेल स्प्रेडशीट में डेटाफ्रेम की सूची कैसे निर्यात कर सकता हूं? राज्य के
लिए दस्तावेज़ to_excel:

नोट्स
यदि कोई मौजूदा ExcelWriter ऑब्जेक्ट पास कर रहा है, तो शीट को मौजूदा कार्यपुस्तिका में जोड़ दिया जाएगा। इसका उपयोग विभिन्न डेटाफ़्रेम को एक कार्यपुस्तिका में सहेजने के लिए किया जा सकता है

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

इसके बाद, मैंने सोचा कि मैं एक फ़ंक्शन लिख सकता हूं जो डेटा स्प्रैम्स की एक सूची को एक स्प्रैडशीट में निम्नानुसार सहेजता है:

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

हालाँकि (दो छोटे डेटाफ़्रेम की सूची के साथ, जिनमें से प्रत्येक to_excelव्यक्तिगत रूप से बचा सकता है), एक अपवाद उठाया जाता है (संपादित करें: ट्रेस हटाया गया) :

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

संभवत: मैं ExcelWriterसही ढंग से कॉल नहीं कर रहा हूं , मुझे ऐसा करने के लिए कैसे होना चाहिए?

जवाबों:


139

आपको पंडों की अपनी 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
आप इस की गति कैसे पा रहे हैं? मैंने कल भी ऐसा ही करने की कोशिश की और पाया कि 2000 कॉलम के साथ एक डेटाफ्रेम लिखने के लिए .xlsx फाइल ठोस स्टेट ड्राइव के साथ एक सभ्य वर्कस्टेशन पर 100 पंक्तियों के बारे में 16s ले रही थी। IPython में% prun के साथ कुछ त्वरित रूपरेखा ने इसे XML प्रसंस्करण के कारण दिखाया। अंत में मुझे CSV के माध्यम से डेटा पूर्णांक एक्सेल मिला क्योंकि ExcelWriter की गति निषेधात्मक रूप से धीमी थी।
snth

6
फिर भी धीमी गति से के रूप में 2018 में
stmax

2
आप ExcelWriterएक संदर्भ प्रबंधक के रूप में भी उपयोग कर सकते हैं । with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
बॉलपॉइंटबैन

2
धन्यवाद एंडी क्या आप मन को 'sheet%s' % nथोड़ा समझाने की कृपा करेंगे? यह क्या करता है और यह कैसे काम करता है?
बोवेन लियू

2
@BowenLiu कि शीट को शीट 1, शीट 2, आदि का नाम दिया जा रहा है
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है? क्या आप इसे समझाएंगे? धन्यवाद!
बोवेन लियू

@BowenLiu जो शब्दकोश की अहमियत लेता है, और इसे एक्सेल शीट में पेज नाम के लिए उपयोग करता है। '% s' एक प्लेसहोल्डर है जो "की" से भरा है। उम्मीद है की वो मदद करदे।
जेरेड मार्क्स

0

कभी-कभी डेटा फ्रेम में कुछ गैर-सहायक चरित्र प्रकार होते हैं, तो समस्याएँ हो सकती हैं (यूनिकोड युक्त एक्सेल फ़ाइल लिखना)। इसे दूर करने के लिए हम ' 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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.