एक पांडा डेटा CSV फ़ाइल को लिखना


713

मेरे पास पंडों में एक डेटाफ्रेम है जिसे मैं एक सीएसवी फ़ाइल में लिखना चाहूंगा। मैं इसका उपयोग कर रहा हूं:

df.to_csv('out.csv')

और त्रुटि हो रही है:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)

क्या इसे आसानी से प्राप्त करने का कोई तरीका है (यानी मेरे डेटा फ़्रेम में यूनिकोड वर्ण हैं)? और वहाँ एक सीएसवी के बजाय एक टैब सीमांकित फ़ाइल को लिखने का एक तरीका है उदाहरण के लिए एक 'टू-टैब' विधि का उपयोग करके (जो मुझे नहीं लगता कि मौजूद है)?

जवाबों:


1045

टैब द्वारा परिसीमन करने के लिए आप निम्नलिखित के sepतर्क का उपयोग कर सकते हैं to_csv:

df.to_csv(file_name, sep='\t')

एक विशिष्ट एन्कोडिंग का उपयोग करने के लिए (जैसे 'utf-8') encodingतर्क का उपयोग करें :

df.to_csv(file_name, sep='\t', encoding='utf-8')

32
मैं index=Falseसूचकांक को छोड़ने के लिए जोड़ूंगा।
मेधात

10
मैं शुरू में उलझन में था कि मुझे उस सवाल का जवाब कैसे मिला जो मैंने 7 साल पहले ही लिखा था।
हेडेन

250

जब आप विधि का उपयोग करके किसी DataFrameऑब्जेक्ट को csv फ़ाइल में संग्रहीत कर रहे हैं to_csv, तो संभवतः आपको ऑब्जेक्ट की प्रत्येक पंक्ति के पूर्ववर्ती सूचकांक को संग्रहीत करने की आवश्यकता नहीं होगी ।DataFrame

आप पैरामीटर को बूलियन मान पास करके इससे बच सकते हैं ।Falseindex

कुछ इस तरह:

df.to_csv(file_name, encoding='utf-8', index=False)

तो अगर आपके DataFrame ऑब्जेक्ट कुछ इस तरह है:

  Color  Number
0   red     22
1  blue     10

सीएसवी फ़ाइल स्टोर होगी:

Color,Number
red,22
blue,10

इसके बजाय ( डिफ़ॉल्ट मान True पारित होने पर मामला )

,Color,Number
0,red,22
1,blue,10

क्या होगा यदि अनुक्रमण वांछित है, लेकिन एक शीर्षक भी होना चाहिए? क्या आप सिर्फ इस्तेमाल करते हैं df.rename_axis('index_name')? वह फ़ाइल को स्वयं नहीं बदलता है
जैप

19

एक CSV फ़ाइल के लिए एक पांडा डेटाफ़्रेम लिखने के लिए, आपको आवश्यकता होगी DataFrame.to_csv। यह फ़ंक्शन उचित चूक के साथ कई तर्क प्रस्तुत करता है जो आपको अपने विशिष्ट उपयोग के मामले के अनुरूप ओवरराइड करने की आवश्यकता से अधिक बार होगा। उदाहरण के लिए, आप एक अलग विभाजक का उपयोग करना चाह सकते हैं, डेटाइम प्रारूप को बदल सकते हैं या लिखते समय सूचकांक को छोड़ सकते हैं। to_csvआपके पास इन आवश्यकताओं को संबोधित करने के लिए तर्क हो सकते हैं।

यहां CSV फ़ाइलों के लिए लेखन के कुछ सामान्य परिदृश्यों और उनके लिए आपके द्वारा उपयोग किए जा सकने वाले तर्कों को सूचीबद्ध करने वाली तालिका दी गई है।

सीएसवी मा डूड को लिखो

फुटनोट

  1. डिफ़ॉल्ट विभाजक को अल्पविराम ( ',') माना जाता है । इसे तब तक न बदलें जब तक आपको पता न हो कि आपको इसकी आवश्यकता है।
  2. डिफ़ॉल्ट रूप से, इंडेक्स dfको पहले कॉलम के रूप में लिखा जाता है। यदि आपके DataFrame में कोई इंडेक्स (IOW, df.indexडिफ़ॉल्ट नहीं है RangeIndex) है, तो आप index=Falseलिखना चाहते हैं । इसे अलग तरीके से समझाने के लिए, यदि आपके डेटा में एक सूचकांक है, तो आप इसका उपयोग ( index=Trueया कर सकते हैं) या इसे पूरी तरह से छोड़ सकते हैं (जैसा कि डिफ़ॉल्ट है True)।
  3. यदि आप स्ट्रिंग डेटा लिख ​​रहे हैं, तो यह पैरामीटर सेट करना बुद्धिमान होगा ताकि अन्य एप्लिकेशन आपके डेटा को पढ़ना सीखें। यह भी किसी भी संभावित UnicodeEncodeErrors से बचा सकता है जबकि आप बचत करते समय मुठभेड़ कर सकते हैं।
  4. यदि आप बड़े DataFrames (> 100K पंक्तियों) को डिस्क पर लिख रहे हैं तो संपीड़न की सिफारिश की जाती है क्योंकि इससे बहुत छोटी आउटपुट फाइलें मिलेंगी। ओटीओएच, इसका मतलब है कि लेखन समय बढ़ेगा (और परिणामस्वरूप, फ़ाइल के पढ़ने के समय से विघटित होने की आवश्यकता होगी)।

18

यदि आप 'utf-8' को एन्कोडिंग करने के लिए समस्याएँ उठा रहे हैं तो कुछ और आप कोशिश कर सकते हैं और सेल द्वारा सेल पर जाना चाहते हैं जो आप निम्नलिखित की कोशिश कर सकते हैं।

अजगर २

(जहां "df" आपकी DataFrame ऑब्जेक्ट है।)

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = unicode(x.encode('utf-8','ignore'),errors ='ignore') if type(x) == unicode else unicode(str(x),errors='ignore')
            df.set_value(idx,column,x)
        except Exception:
            print 'encoding error: {0} {1}'.format(idx,column)
            df.set_value(idx,column,'')
            continue

फिर कोशिश करो:

df.to_csv(file_name)

आप कॉलम की एन्कोडिंग की जाँच कर सकते हैं:

for column in df.columns:
    print '{0} {1}'.format(str(type(df[column][0])),str(column))

चेतावनी: त्रुटियाँ = 'अनदेखा' केवल चरित्र को छोड़ देगा

IN: unicode('Regenexx\xae',errors='ignore')
OUT: u'Regenexx'

अजगर ३

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = x if type(x) == str else str(x).encode('utf-8','ignore').decode('utf-8','ignore')
            df.set_value(idx,column,x)
        except Exception:
            print('encoding error: {0} {1}'.format(idx,column))
            df.set_value(idx,column,'')
            continue

11

यदि आप UTF-8 एन्कोडिंग को भी निर्दिष्ट करते हैं, तो कभी-कभी आपको इन समस्याओं का सामना करना पड़ता है। मैं आपको फ़ाइल पढ़ने के दौरान एन्कोडिंग निर्दिष्ट करने की सलाह देता हूं और फ़ाइल को लिखते समय समान एन्कोडिंग। इससे आपकी समस्या हल हो सकती है।


7

Windows पर पूर्ण पथ के साथ फ़ाइल में निर्यात का उदाहरण और यदि आपकी फ़ाइल में हेडर हैं :

df.to_csv (r'C:\Users\John\Desktop\export_dataframe.csv', index = None, header=True) 

उदाहरण यदि आपको फ़ोल्डर में उसी निर्देशिका में संग्रहीत करना है जहां आपकी स्क्रिप्ट utf-8 एन्कोडिंग और विभाजक के रूप में टैब के साथ है :

df.to_csv(r'./export/dftocsv.csv', sep='\t', encoding='utf-8', header='true')

7

यह इस मामले के लिए जवाब नहीं हो सकता है, लेकिन जैसा कि .to_csvमैंने कोशिश की थी के साथ एक ही त्रुटि-संदेश था .toCSV('name.csv')और त्रुटि-संदेश था (" SparseDataFrame' object has no attribute 'toCSV')। इसलिए डेटाफ़्रेम को घने डेटाफ़्रेम में बदलकर समस्या का समाधान किया गया था।

df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')

आपको दूसरे में त्रुटि मिली क्योंकि यह ऐसा लगता है जैसे आपने उपयोग किया था .toCSVऔर नहीं .to_csv। आप अंडरस्कोर भूल गए
काइल सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.