2016-05-14 6 views
1

私は3GBのCSVファイルを持っています。私はパンダでHDF形式に保存しようとしていますので、より速く読み込むことができます。CSVファイルの行数を制限するPandas HDF

import pandas as pd 
import traceback 

df_all = pd.read_csv('file_csv.csv', iterator=True, chunksize=20000) 

for _i, df in enumerate(df_all): 
    try: 
     print ('Saving %d chunk...' % _i, end='') 
     df.to_hdf('file_csv.hdf', 
        'file_csv', 
        format='table', 
        data_columns=True) 
     print ('Done!') 
    except: 
     traceback.print_exc() 
     print (df) 
     print (df.info()) 

del df_all 

オリジナルのCSVファイルには、このコードの出力に反映されている約300万行があります。出力の最後の行は次のとおりです。167チャンクを保存...完了! 意味:167 * 20000 = 3.340.000行

私の問題は次のとおりです。

df_hdf = pd.read_hdf('file_csv.hdf') 
df_hdf.count() 

=> 4613行

そして:でもI」

item_info = pd.read_hdf('ItemInfo_train.hdf', where="item=1") 

戻り値は何も、 「item」列のエントリが元のファイルの1に等しいことを確認してください。

何が間違っていますか?

+0

あなたは 'からの出力を表示することができますdf_hdf.info()' 'count'がNaN以外の観測値の数をカウントします必ずしも行の数と同じではありません – EdChum

+0

あなたはappend = Trueが必要です – Jeff

答えて

0

append=Trueを使用して、to_hdfに新しいチャンクを同じファイルに追加するように指示します。

df.to_hdf('file_csv.hdf', ..., append=True) 

そうでない場合は、各呼び出しは、以前の内容を上書きし、唯一の最後のチャンクはfile_csv.hdfに保存されたまま。


import os 
import numpy as np 
import pandas as pd 

np.random.seed(2016) 
df = pd.DataFrame(np.random.randint(10, size=(100, 2)), columns=list('AB')) 
df.to_csv('file_csv.csv') 
if os.path.exists('file_csv.hdf'): os.unlink('file_csv.hdf') 
for i, df in enumerate(pd.read_csv('file_csv.csv', chunksize=50)): 
    print('Saving {} chunk...'.format(i), end='') 
    df.to_hdf('file_csv.hdf', 
       'file_csv', 
       format='table', 
       data_columns=True, 
       append=True) 
    print('Done!') 
    print(df.loc[df['A']==1]) 
print('-'*80) 
df_hdf = pd.read_hdf('file_csv.hdf', where="A=1") 
print(df_hdf) 

プリント

Unnamed: 0 A B 
22   22 1 7 
30   30 1 7 
41   41 1 9 
44   44 1 0 
19   69 1 3 
29   79 1 1 
31   81 1 5 
34   84 1 6 

同じファイルに新しいチャンクを追加するto_hdfを伝えるためにappend=Trueを使用してください。それ以外の場合は、唯一の最後のチャンクはfile_csv.hdfに保存されます。

import os 
import numpy as np 
import pandas as pd 

np.random.seed(2016) 
df = pd.DataFrame(np.random.randint(10, size=(100, 2)), columns=list('AB')) 
df.to_csv('file_csv.csv') 
if os.path.exists('file_csv.hdf'): os.unlink('file_csv.hdf') 
for i, df in enumerate(pd.read_csv('file_csv.csv', chunksize=50)): 
    print('Saving {} chunk...'.format(i), end='') 
    df.to_hdf('file_csv.hdf', 
       'file_csv', 
       format='table', 
       data_columns=True, 
       append=True) 
    print('Done!') 
    print(df.loc[df['A']==1]) 
print('-'*80) 
df_hdf = pd.read_hdf('file_csv.hdf', where="A=1") 
print(df_hdf) 

プリントが

Unnamed: 0 A B 
22   22 1 7 
30   30 1 7 
41   41 1 9 
44   44 1 0 
19   69 1 3 
29   79 1 1 
31   81 1 5 
34   84 1 6 
関連する問題