2013-03-21 1 views
6

कैसे मैं एक फ़ाइल के माध्यम से pd.read_csv() के लिए iteratively हिस्सा उपयोग कर सकते हैं और के रूप में अगर मैं एक ही बार में पूरे डाटासेट में पढ़ा dtype और अन्य मेटा जानकारी को बनाए रखने?अनुमानित dataframe प्रकार जाओ iteratively chunksize का उपयोग कर

मुझे डेटासेट में फिट करने के लिए बहुत बड़ा डेटासेट में पढ़ने की आवश्यकता है। मैं pd.read_csv का उपयोग कर फ़ाइल आयात करना चाहता हूं और फिर तुरंत एचडीएफस्टोर में खंड को जोड़ना चाहता हूं। हालांकि, डेटा प्रकार अनुमान को बाद के हिस्सों के बारे में कुछ नहीं पता है।

यदि तालिका में संग्रहीत पहला खंड केवल int है और उसके बाद के हिस्से में एक फ्लोट होता है, तो एक अपवाद उठाया जाएगा। तो मुझे read_csv का उपयोग करके डेटाफ्रेम के माध्यम से पहले पुन: प्रयास करना होगा और उच्चतम अनुमानित प्रकार को बनाए रखना होगा। इसके अलावा, ऑब्जेक्ट प्रकारों के लिए, मुझे अधिकतम लंबाई बनाए रखने की आवश्यकता है क्योंकि इन्हें तालिका में स्ट्रिंग के रूप में संग्रहीत किया जाएगा।

क्या संपूर्ण डेटासेट में पढ़े बिना केवल इस जानकारी को बनाए रखने का एक शानदार तरीका है?

उत्तर

8

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

In [1]: chunker = pd.read_csv('DATASET.csv', chunksize=500, header=0) 

# Store the dtypes of each chunk into a list and convert it to a dataframe: 

In [2]: dtypes = pd.DataFrame([chunk.dtypes for chunk in chunker]) 

In [3]: dtypes.values[:5] 
Out[3]: 
array([[int64, int64, int64, object, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64], 
     [int64, int64, int64, int64, int64, int64, int64, int64]], dtype=object) 

# Very cool that I can take the max of these data types and it will preserve the hierarchy: 

In [4]: dtypes.max().values 
Out[4]: array([int64, int64, int64, object, int64, int64, int64, int64], dtype=object) 

# I can now store the above into a dictionary: 

types = dtypes.max().to_dict() 

# And pass it into pd.read_csv fo the second run: 

chunker = pd.read_csv('tree_prop_dset.csv', dtype=types, chunksize=500) 
+0

आप भी skiprows इस्तेमाल कर सकते हैं पंक्तियों को छोड़ की एक सूची =, और यह 1-9 इसलिए उर नमूने में प्रत्येक पंक्ति को छोड़ दिया है केवल 10 वीं पंक्तियां, बहुत तेज होंगी (और आपको जो जवाब चाहिए वह प्राप्त होगा), मुझे लगता है कि आपको अपनी छोड़ी गई पंक्तियों को स्वयं उत्पन्न करने की आवश्यकता होगी – Jeff

+0

@ जेफ आप सीएसवी में पंक्तियों की कुल संख्या जानने के बिना कैसे प्राप्त करेंगे, जो – Luke

+3

में इसे पढ़ने में शामिल होगा, आपको सभी ड्यूटीप्स को स्टोर करने और अंत में कम करने के बजाय, प्रत्येक खंड पुनरावृत्ति के बाद अधिकतम डाइटप्स चुनने पर भी विचार करना चाहिए। उदाहरण के लिए, 2 एमएम पंक्तियों के साथ एक सीएसवी, और 500 का एक हिस्सा आकार, फ्रेम में 400,000 पंक्तियों का परिणाम होगा! – jastr

संबंधित मुद्दे