2017-12-05 11 views
5

私は、read_csvを使用して、2つのデータフレームをパンダでマージしようとしています。しかし、私のデータフレーム(この例ではd1)はコンピュータが扱うには大きすぎるので、私はread_csviterator引数を使用しています。パンダで繰り返しデータフレームをマージする

のは、私は、各行がそれぞれの人のためのすべてのデータをキャプチャし、そうするのと同等となるようにそれらをマージする必要がある2つのデータフレーム

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") 

が、私はできるので、 d1をメモリにフィットさせるために、私はread_csvを使用していました(私は既に巨大なファイルを処理して.csv形式で保存していますので、test.csvというファイルにデータフレームd1が入っていると思います)。

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") 

私の出力が第二データフレームによって付加される最初のデータフレームで行います。

私の出力は次のようになります。

 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

速い答え:それはメモリに収まらない大きなデータフレームを処理することができ、DASKライブラリを使用しよう:http://dask.pydata.org/en/latest/ – CrazyElf

+1

*私の出力は、2番目のデータフレームによって追加された最初のデータフレームです。* ...何を望みましたか? – Parfait

+0

ネストされた連結を試してください: 'pd.concat([d1、pd.concat(itera、ignore_index = True)])' – Parfait

答えて

1

私はあなたがcombine first方法を探していると思います。これは基本的に、df1read_csvイテレータの各チャンクの値で更新します。

ように見える d1を返し
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) 

  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つのデータセットの和集合をとって、私のd2が少なくとも1桁大きくなるようになっています(それは2倍になり、チャンクで見つけることができる値繰り返し)。だから私が望んでいたものではないが、それは私が求めていたものだ。ありがとう、私は今私の目標にもう少し近いと思う。 –

+0

'd1'は' d2'よりも大きいですか?私が最後にあなたの質問を読んだとき、私はその反対を考えました。 – dubbbdan

+0

さて、私は、将来の参考のために投稿を明確にしました。しかし、そうです。 –

関連する問題