pandas

2017-12-05 37 views
5

के साथ डेटा फ्रेम को विलय कर रहा है मैं read_csv का उपयोग करके पांडा में दो डेटाफ्रेम मर्ज करने का प्रयास कर रहा हूं। लेकिन मेरे डेटाफ्रेम में से एक (इस उदाहरण में d1) मेरे कंप्यूटर को संभालने के लिए बहुत बड़ा है, इसलिए मैं में iterator तर्क का उपयोग कर रहा हूं।pandas

चलो कहते हैं कि मैं दो dataframes

d1 = pd.DataFrame({ 
    "col1":[1,2,3,4,5,6,7,8,9], 
    "col2": [5,4,3,2,5,43,2,5,6], 
    "col3": [10,10,10,10,10,4,10,10,10]}, 
    index=["paul", "peter", "lauren", "dave", "bill", "steve", "old-man", "bob", "tim"]) 

d2 = pd.DataFrame({ 
    "yes/no": [1,0,1,0,1,1,1,0,0]}, 
    index=["paul", "peter", "lauren", "dave", "bill", "steve", "old-man", "bob", "tim"]) 

मैं उन्हें एक करना इतना है कि प्रत्येक पंक्ति प्रत्येक व्यक्ति के लिए सभी डेटा कैप्चर करता है की जरूरत है दें, ताकि के बराबर कर रही:

pd.concat((d1,d2), axis=1,join="outer") 

लेकिन जब से मैं यह कर सकते हैं स्मृति में फिट 1 नहीं है, मैं read_csv का उपयोग कर रहा हूं (मैं read_csv का उपयोग कर रहा हूं क्योंकि मैंने पहले ही एक बड़ी फ़ाइल संसाधित की है और इसे .csv प्रारूप में सहेजा है, इसलिए कल्पना करें कि मेरा डेटाफ्रेम डी 1 फ़ाइल test.csv फ़ाइल में निहित है)।

itera = pd.read_csv("test.csv",index_col="index",iterator=True,chunksize=2) 

लेकिन जब मैं

for i in itera: 
    d2 = pd.concat((d2,i), axis=1,join="outer") 

करना मेरी उत्पादन पहले dataframe दूसरा dataframe द्वारा संलग्न है।

मेरे उत्पादन इस तरह दिखता है:

 col1 col2 col3 yes/no 
one  NaN NaN NaN  1.0 
two  NaN NaN NaN  0.0 
three NaN NaN NaN  1.0 
four NaN NaN NaN  0.0 
five NaN NaN NaN  1.0 
six  NaN NaN NaN  1.0 
seven NaN NaN NaN  1.0 
eight NaN NaN NaN  0.0 
nine NaN NaN NaN  0.0 
one  1.0 5.0 10.0  NaN 
two  2.0 4.0 10.0  NaN 
three 3.0 3.0 10.0  NaN 
four 4.0 2.0 10.0  NaN 
five 5.0 5.0 10.0  NaN 
six  6.0 43.0 4.0  NaN 
seven 7.0 2.0 10.0  NaN 
eight 8.0 5.0 10.0  NaN 
nine 9.0 6.0 10.0  NaN 

आशा है कि मेरे सवाल समझ :)

+1

फास्ट जवाब:, यह बड़ा dataframes जो स्मृति में फिट नहीं कर सकते हैं संभाल कर सकते हैं Dask पुस्तकालय का उपयोग करने का प्रयास करें: http://dask.pydata.org/en/नवीनतम/ – CrazyElf

+1

* मेरा आउटपुट दूसरा डेटाफ्रेम * द्वारा जोड़ा गया पहला डेटाफ्रेम है ... आप क्या चाहते थे? – Parfait

+0

एक नेस्टेड कॉन्सैट आज़माएं: 'pd.concat ([d1, pd.concat (itera, ignore_index = True)]) – Parfait

उत्तर

1

मुझे लगता है कि आप combine first विधि के लिए देख रहे हैं बनाता है। यह मूल रूप से df1 को read_csv इटरेटर में प्रत्येक खंड से मूल्यों के साथ अद्यतन करता है।

import pandas as pd 
from StringIO import StringIO 

d1 = pd.DataFrame({ 
    "col1":[1,2,3,4,5,6,7,8,9], 
    "col2": [5,4,3,2,5,43,2,5,6], 
    "col3": [10,10,10,10,10,4,10,10,10]}, 
    index=["paul", "peter", "lauren", "dave", "bill", "steve", "old-man", "bob", "tim"]) 


#d2 converted to string tho use with pd.read_csv 
d2 = StringIO("""y/n col5 
paul 1 
peter 0 
lauren 1 
dave 0 
bill 1 
steve 1 
old-man 1 
bob 0 
tim 0 
""") 

#For each chunk update d1 with data 
for chunk in pd.read_csv(d2, sep = ' ',iterator=True,chunksize=1): 
    d1 = d1.combine_first(chunk[['y/n']]) 
#Number formatting 
d1['y/n'] = d1['y/n'].astype(int) 

कौन सा रिटर्न d1 की तरह लग रही:

  col1 col2 col3 y/n 
bill  5  5 10 1 
bob   8  5 10 0 
dave  4  2 10 0 
lauren  3  3 10 1 
old-man  7  2 10 1 
paul  1  5 10 1 
peter  2  4 10 0 
steve  6 43  4 1 
tim   9  6 10 0 
+0

उत्तर के रूप में चिह्नित किया गया है, क्योंकि यह मुझे आउटपुट देता है जिसे मैंने पूछा था। लेकिन जब मैं इसे बड़े पैमाने पर कोशिश करता हूं तो यह उन दो डेटासेटों का संघ ले रहा है जो मेरा डी 2 कम से कम परिमाण का क्रम बनता है (ऐसा लगता है कि यह दो गुना बड़ा हो रहा है, जो मूल्यों को कम करता है, प्रत्येक यात्रा)। तो भले ही यह मैं नहीं चाहता था, वही है जो मैंने पूछा था; धन्यवाद, मुझे लगता है कि मैं अब अपने लक्ष्य के करीब थोड़ा हूँ। –

+0

'd1'' d2' से बड़ा है? पिछली बार मैंने आपके प्रश्न को पढ़ा, मैंने विपरीत विचार किया। – dubbbdan

+0

ठीक है, मैंने भविष्य के संदर्भ के लिए पोस्ट को स्पष्ट किया है; लेकिन हाँ यह है। –

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