पंडों ने read_csv low_memory और dtype विकल्प


320

जब बुला रहे हो

df = pd.read_csv('somefile.csv')

मुझे मिला:

/User/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/io/parsers.py:1130: DtypeWarning: Columns (4,5,7,16) में मिश्रित प्रकार होते हैं। आयात पर dtype विकल्प निर्दिष्ट करें या low_memory = गलत सेट करें।

dtypeविकल्प क्यों संबंधित है low_memory, और यह Falseइस समस्या से निपटने में मदद क्यों करेगा ?


2
इस चेतावनी के बारे में मेरा एक प्रश्न है। क्या स्तंभों का सूचकांक 0-आधारित है? उदाहरण के लिए कॉलम 4 जिसमें एक मिश्रित प्रकार है, वह है df [:, 4] या df [:, 3]
maziar

@maziar एक सीएसवी को पढ़ते समय, डिफ़ॉल्ट रूप से एक नया 0-आधारित इंडेक्स बनाया और उपयोग किया जाता है।
फायरलाइक्स

जवाबों:


431

पदावनत low_memory विकल्प

low_memoryविकल्प ठीक से पदावनत नहीं है, लेकिन यह, होना चाहिए, क्योंकि यह वास्तव में कुछ अलग नहीं है [ स्रोत ]

इस low_memoryचेतावनी को प्राप्त करने का कारण यह है क्योंकि प्रत्येक कॉलम के लिए dtypes का अनुमान लगाना बहुत स्मृति की मांग है। पंडों ने यह निर्धारित करने की कोशिश की कि प्रत्येक कॉलम में डेटा का विश्लेषण करके क्या सेट किया जाए।

प्रतिरूप अनुमान (बहुत बुरा)

पांड केवल यह निर्धारित कर सकते हैं कि पूरी फ़ाइल पढ़ने के बाद एक कॉलम में क्या होना चाहिए। इसका मतलब यह है कि पूरी फ़ाइल पढ़ने से पहले वास्तव में कुछ भी पार्स नहीं किया जा सकता है जब तक कि अंतिम मूल्य को पढ़ने पर आपको उस कॉलम के dtype को बदलने का जोखिम न हो।

एक फ़ाइल के उदाहरण पर विचार करें, जिसमें user_id नामक एक कॉलम है। इसमें 10 मिलियन पंक्तियाँ होती हैं जहाँ user_id हमेशा संख्याएँ होती हैं। चूंकि पांडा यह नहीं जान सकते हैं कि यह केवल संख्या है, यह संभवतः इसे मूल तार के रूप में रखेगा जब तक कि यह पूरी फाइल को नहीं पढ़ ले।

निर्दिष्ट dtypes (हमेशा किया जाना चाहिए)

जोड़ने

dtype={'user_id': int}

करने के लिए pd.read_csv()कॉल पांडा पता कर देगा जब यह फ़ाइल को पढ़ने शुरू होता है, कि यह केवल पूर्णांकों है।

यह भी ध्यान देने योग्य है कि यदि फ़ाइल में अंतिम पंक्ति कॉलम "foobar"में लिखी गई user_idहोगी, तो उपरोक्त dtype निर्दिष्ट होने पर लोडिंग क्रैश हो जाएगी।

टूटे हुए डेटा का उदाहरण जो dtypes परिभाषित होने पर टूट जाता है

import pandas as pd
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO


csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})

ValueError: invalid literal for long() with base 10: 'foobar'

dtypes आम तौर पर एक ख़ास बात है, उनके बारे में यहाँ और अधिक पढ़ें: http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html

क्या dtypes मौजूद है?

हमारे पास अफीम dtypes तक पहुंच है: फ्लोट, इंट, बूल, टाइमडेल्ट 64 [एनएस] और डेटाटाइम 64 [एनएस]। ध्यान दें कि संख्यात्मक तिथि / समय dtypes समय क्षेत्र के बारे में जानते नहीं हैं ।

पंडों ने खुद के साथ dtypes के इस सेट का विस्तार किया:

'datetime64 [ns,]' जो टाइम ज़ोन जागरूक टाइमस्टैम्प है।

'श्रेणी' जो अनिवार्य रूप से एक एनम है (बचत करने के लिए पूर्णांक कुंजी द्वारा दर्शाए गए तार

'अवधि []' एक समयसीमा के साथ भ्रमित नहीं होने के लिए, इन वस्तुओं को वास्तव में विशिष्ट समय अवधि के लिए लंगर डाला जाता है

'स्पार्स', 'स्पार्स [int]', 'स्पार्स [फ्लोट]' विरल डेटा के लिए है या 'डेटा जिसमें इसमें बहुत सारे छेद हैं' NaN को बचाने के बजाय या कोई भी डेटाफ़्रेम में ऑब्जेक्ट्स को छोड़ता नहीं है, अंतरिक्ष की बचत करता है ।

'अंतराल' स्वयं का एक विषय है लेकिन इसका मुख्य उपयोग अनुक्रमण के लिए है। यहाँ और देखें

'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' ये सभी पांडा विशिष्ट पूर्णांक हैं, जो सुप्त संस्करण के विपरीत, अशक्त हैं।

'स्ट्रिंग' स्ट्रिंग डेटा के साथ काम करने के लिए एक विशिष्ट dtype है और .strश्रृंखला पर विशेषता तक पहुंच प्रदान करता है ।

'बूलियन' सुन्न 'बूल' की तरह है, लेकिन यह लापता डेटा का भी समर्थन करता है।

पूरा संदर्भ यहां पढ़ें:

पंडों dtype संदर्भ

गोच, कैविएट, नोट्स

सेटिंग dtype=objectउपरोक्त चेतावनी को चुप करा देगी, लेकिन यह अधिक मेमोरी कुशल नहीं बनाएगी, केवल यदि कुछ भी हो तो प्रक्रिया को कुशल बनाएं।

सेटिंग dtype=unicodeकुछ नहीं करेंगे, numpy के बाद से, एक unicodeके रूप में प्रस्तुत किया जाता है object

कन्वर्टर्स का उपयोग

@ स्पर सही 'foobar'रूप में निर्दिष्ट कॉलम में मुठभेड़ करते समय उड़ने वाले पांडा से बचने के लिए कन्वर्टर्स के उपयोग को सही ढंग से इंगित करता है int। मैं यह जोड़ना चाहूंगा कि कन्वर्टर्स वास्तव में भारी और पांडा में उपयोग करने के लिए अक्षम हैं और उन्हें अंतिम उपाय के रूप में उपयोग किया जाना चाहिए। ऐसा इसलिए है क्योंकि read_csv प्रक्रिया एक एकल प्रक्रिया है।

CSV फ़ाइलों को लाइन द्वारा लाइन में संसाधित किया जा सकता है और इस तरह से कई कन्वर्टर्स द्वारा समानांतर रूप से अधिक कुशलता से संसाधित किया जा सकता है फ़ाइल को खंडों में काटकर और कई प्रक्रियाओं को चलाकर, कुछ ऐसा जो पांडा का समर्थन नहीं करता है। लेकिन यह एक अलग कहानी है।


6
इसलिए, यह देखते हुए कि सेटिंग dtype=objectको अधिक मेमोरी कुशल नहीं है, क्या त्रुटि से छुटकारा पाने के अलावा इसके साथ गड़बड़ करने का कोई कारण है?
zthomas.nc

6
@ zthomas.nc हां, पंडों को परीक्षण में परेशान होने की जरूरत नहीं है कि स्तंभ में क्या है। सैद्धांतिक रूप से कुछ स्मृति बचत लोड हो रहा है (लेकिन लोड हो रहा है के बाद से कोई भी पूरा हो गया है), जबकि और कुछ CPU चक्र (जो आप नहीं नोटिस डिस्क मैं के बाद से / ओ टोंटी होगा सैद्धांतिक रूप से बचत।
firelynx

5
"यह भी ध्यान देने योग्य है कि यदि फ़ाइल में अंतिम पंक्ति में" foobar "लिखा होता है तो user_id कॉलम में, यदि उपरोक्त dtype निर्दिष्ट किया जाता है तो लोडिंग क्रैश हो जाएगी।" क्या कुछ "मोटे" विकल्प हैं जिनका उपयोग दुर्घटनाग्रस्त होने के बजाय इस पंक्ति को फेंकने के लिए किया जा सकता है?
गौरैया

5
@ सैपरो हो सकता है, लेकिन पिछली बार जब मैंने इसका इस्तेमाल किया तो इसमें कीड़े थे। यह पंडों के नवीनतम संस्करण में तय किया जा सकता है। error_bad_lines=False, warn_bad_lines=Trueचाल चलनी चाहिए। प्रलेखन कहता है कि यह केवल सी पार्सर के साथ मान्य है। यह भी कहता है कि डिफ़ॉल्ट पार्सर कोई भी नहीं है जो यह जानना मुश्किल बनाता है कि कौन सा डिफ़ॉल्ट है।
फायरक्लेक्स

5
@nealmcb आप डेटाफ्रेम nrows=100को एक तर्क के रूप में पढ़ सकते हैं और फिर df.dtypesआपको प्राप्त होने वाले dtypes को देखने के लिए करते हैं। हालाँकि, इन dtypes के साथ पूरे डेटाफ़्रेम को पढ़ते समय, ऐसा करना सुनिश्चित करें try/exceptताकि आप दोषपूर्ण dtype अनुमानों को पकड़ सकें। डेटा गंदा है आप जानते हैं।
फायरलैक्स

50

प्रयत्न:

dashboard_df = pd.read_csv(p_file, sep=',', error_bad_lines=False, index_col=False, dtype='unicode')

पांडा प्रलेखन के अनुसार:

dtype: टाइप नाम या कॉलम का ताना -> प्रकार

Low_memory के रूप में, यह डिफ़ॉल्ट रूप से सत्य है और अभी तक प्रलेखित नहीं है। मुझे नहीं लगता कि यह प्रासंगिक है। त्रुटि संदेश सामान्य है, इसलिए आपको वैसे भी low_memory के साथ गड़बड़ करने की आवश्यकता नहीं होनी चाहिए। आशा है कि यह मदद करता है और मुझे पता है अगर आप आगे की समस्या है


1
dtype=unicodeउत्पादन जोड़ना NameError: name 'unicode' is not defined:। लेकिन unicodeउद्धरण में (जैसा कि 'यूनिकोड' में है) काम करता है!
18

5
@ सेंध आप dtypes या तो अजगर प्रकार या के रूप में निर्दिष्ट कर सकते हैं numpy.dtype('unicode')। जब आप dtype विकल्प को एक स्ट्रिंग देते हैं, तो यह numpy.dtype()फ़ैक्टरी द्वारा डिफ़ॉल्ट रूप से डालने का प्रयास करेगा । निर्दिष्ट करने 'unicode'से वास्तव में कुछ भी नहीं होगा, यूनिकोड को केवल अपकास्ट किया जाता है objects। आपको मिलेगाdtype='object'
जुगनू

43
df = pd.read_csv('somefile.csv', low_memory=False)

इस मुद्दे को हल करना चाहिए। CSV से 1.8M पंक्तियाँ पढ़ने पर मुझे ठीक वैसी ही त्रुटि मिली।


51
यह त्रुटि को शांत करता है, लेकिन वास्तव में कुछ और नहीं बदलता है।
फायरलैक्स

2
1.5gb डेटाफ़ाइल चलाते समय मुझे एक ही समस्या है
Sitz Blogz

18

जैसा कि पहले उल्लेख किया गया है कि फायरलैक्स यदि dtype स्पष्ट रूप से निर्दिष्ट है और मिश्रित डेटा है जो उस dtype के साथ संगत नहीं है तो लोड हो रहा है क्रैश हो जाएगा। मैंने असंगत डेटा प्रकार के साथ मूल्यों को बदलने के लिए वर्कअराउंड के रूप में इस तरह के एक कनवर्टर का उपयोग किया ताकि डेटा अभी भी लोड हो सके।

def conv(val):
    if not val:
        return 0    
    try:
        return np.float64(val)
    except:        
        return np.float64(0)

df = pd.read_csv(csv_file,converters={'COL_A':conv,'COL_B':conv})

2

मेरे पास एक समान मुद्दा था ~ 400MB फ़ाइल। सेटिंग low_memory=Falseने मेरे लिए चाल चली। पहले साधारण चीजें करें, मैं जांच करूंगा कि आपका डेटाफ्रेम आपके सिस्टम मेमोरी, रिबूट से बड़ा नहीं है, आगे बढ़ने से पहले रैम को साफ करें। यदि आप अभी भी त्रुटियों में चल रहे हैं, तो यह सुनिश्चित करने के लायक है कि आपकी .csvफ़ाइल ठीक है, एक्सेल में एक त्वरित नज़र डालें और सुनिश्चित करें कि कोई स्पष्ट भ्रष्टाचार नहीं है। टूटा हुआ मूल डेटा कहर बरपा सकता है ...


1

जब मैं एक बड़ी सीएसएसवी फाइल (6 मिलियन पंक्तियों) को संसाधित कर रहा था तो मुझे एक समान समस्या का सामना करना पड़ रहा था। मेरे पास तीन मुद्दे थे: 1. फ़ाइल में अजीब अक्षर थे (एन्कोडिंग का उपयोग करके तय किया गया था) 2. डेटाटाइप निर्दिष्ट नहीं किया गया था (dtype संपत्ति का उपयोग करके तय किया गया था) 3. उपरोक्त का उपयोग करते हुए मुझे अभी भी एक समस्या का सामना करना पड़ा जो कि file_format के साथ संबंधित था जो कि नहीं हो सकता था फ़ाइल नाम के आधार पर परिभाषित किया गया है (कोशिश का उपयोग करके .. को छोड़कर ..)

df = pd.read_csv(csv_file,sep=';', encoding = 'ISO-8859-1',
                 names=['permission','owner_name','group_name','size','ctime','mtime','atime','filename','full_filename'],
                 dtype={'permission':str,'owner_name':str,'group_name':str,'size':str,'ctime':object,'mtime':object,'atime':object,'filename':str,'full_filename':str,'first_date':object,'last_date':object})

try:
    df['file_format'] = [Path(f).suffix[1:] for f in df.filename.tolist()]
except:
    df['file_format'] = ''

-1

low_memory = Falseडेटाफ़्रेम आयात करते समय इसने मेरे साथ काम किया । वह सभी बदलाव जो मेरे लिए काम आए:

df = pd.read_csv('export4_16.csv',low_memory=False)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.