2016-09-27 8 views
8

मेरे पास एक बड़ी फ़ाइल (2 जीबी) स्पष्ट डेटा है (ज्यादातर "नैन" - लेकिन वास्तविक मूल्यों के साथ यहां और वहां आबादी है) जो एक डेटा फ्रेम में पढ़ने के लिए बहुत बड़ा है । मुझे प्रत्येक कॉलम के लिए सभी अद्वितीय मूल्यों को स्टोर करने के लिए एक ऑब्जेक्ट के साथ आने का एक कठिन समय था (जो मेरा लक्ष्य है - अंत में मुझे इसे मॉडलिंग के लिए कारक बनाने की आवश्यकता है)सूचियों की सूची विकसित करने के लिए पाइथोनिक तरीका

मैंने इसे समाप्त करने के बाद फ़ाइल को पढ़ रहा था डेटाफ्रेम में भाग में और फिर प्रत्येक कॉलम के अद्वितीय मान प्राप्त करें और उन्हें सूचियों की सूची में स्टोर करें। मेरा समाधान काम करता है, लेकिन अधिकांश अन-पायथनिक लग रहा था - क्या यह पाइथन (ver 3.5) में इसे पूरा करने का एक क्लीनर तरीका है। मुझे कॉलम की संख्या पता है (~ 2100)।

import pandas as pd 
#large file of csv separated text data 
data=pd.read_csv("./myratherlargefile.csv",chunksize=100000, dtype=str) 

collist=[] 
master=[] 
i=0 
initialize=0 
for chunk in data: 
    #so the first time through I have to make the "master" list 
    if initialize==0: 
     for col in chunk: 
      #thinking about this, i should have just dropped this col 
      if col=='Id': 
       continue 
      else: 
       #use pd.unique as a build in solution to get unique values 
       collist=chunk[col][chunk[col].notnull()].unique().tolist() 
       master.append(collist) 
       i=i+1 
    #but after first loop just append to the master-list at 
    #each master-list element 
    if initialize==1: 
     for col in chunk: 
      if col=='Id': 
       continue 
      else: 
       collist=chunk[col][chunk[col].notnull()].unique().tolist() 
       for item in collist: 
        master[i]=master[i]+collist 
       i=i+1 
    initialize=1 
    i=0 

उसके बाद, सभी अनन्य मानों के लिए अपने अंतिम कार्य इस प्रकार है:

i=0 
names=chunk.columns.tolist() 
for item in master: 
    master[i]=list(set(item)) 
    master[i]=master[i].append(names[i+1]) 
    i=i+1 

इस प्रकार गुरु [i] मुझे स्तंभ नाम और उसके बाद अद्वितीय मानों की सूची देता है - कच्चे तेल की लेकिन यह काम करता है - मेरी मुख्य चिंता सूची को "बेहतर" तरीके से बना रही है यदि संभव हो तो।

+0

आप पर विचार किया है उपयोग करने के लिए एक जनरेटर का उपयोग lazily फ़ाइल को पढ़ने के लिए बेहतर है? (उपज कीवर्ड देखें) – salparadise

+0

यह चाल चल सकता है। मैं अभी भी इटरेटर्स और जेनरेटर के साथ अच्छा नहीं हूं - लेकिन सुझाए गए उपज कीवर्ड पर एक सरसरी नज़र सही दिशा में प्रतीत होता है। – RDS

+0

यह वास्तव में हुड के नीचे जनरेटर का उपयोग कर रहा है। चुनौती ठीक वही कर रही है। जिज्ञासा से आप 32 या 64 बिट मशीन/पायथन पर चल रहे हैं? 'आयात sys; प्रिंट (sys.maxsize) 'को तब तक काम करना चाहिए जब आप पाइथन 2.6 –

उत्तर

8

के list के list के बजाय collections.defaultdict(set) का उपयोग करके मैं सुझाव दूंगा।

for chunk in data: 
    for col in chunk: 
     uniques[col] = uniques[col].union(chunk[col].unique()) 

ध्यान दें कि:

  1. defaultdict हमेशा एक uniques[col] के लिए set (जो है

    आप

    uniques = collections.defaultdict(set) 
    

    के साथ शुरू अब पाश कुछ इस तरह बन सकता है कहो इसके लिए क्या है), ताकि आपछोड़ सकेंऔर सामान।

  2. किसी दिए गए col के लिए, आप बस वर्तमान सेट के संघ के साथ प्रविष्टि को अपडेट करते हैं (जो प्रारंभ में खाली है, लेकिन इससे कोई फर्क नहीं पड़ता) और नए अद्वितीय तत्व।

संपादित

रेमंड Hettinger नोटों के रूप में (धन्यवाद!), यह

 uniques[col].update(chunk[col].unique()) 
+0

वाह - यह 1/3 कोड में चाल है। मुझे डिक्ट्स पर भी काम करने की ज़रूरत है। बहुत बढ़िया। – RDS

+0

@ आरडीएस धन्यवाद। मुझे आपका प्रश्न पसंद आया। शुभकामनाएं। –

+0

यह 'set.union'' की बजाय' set.update'' के साथ अच्छा लगेगा। –

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