2016-05-14 17 views
1

Ich habe eine CSV-Datei mit 3 GB. Ich versuche, es mit Pandas im HDF-Format zu speichern, damit ich es schneller laden kann.Pandas HDF Begrenzung der Anzahl der Zeilen der CSV-Datei

Die ursprüngliche CSV-Datei enthält etwa 3 Millionen Zeilen, was sich in der Ausgabe dieses Codeabschnitts widerspiegelt. Die letzte Zeile der Ausgabe ist: 167 Stück speichern ... Fertig! Das heißt: 167 * 20000 = 3.340.000 Zeilen

Mein Problem ist:

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

=> 4613 Zeilen

Und:

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

nichts Returns, auch ich Ich bin sicher, dass die "item" -Spalte einen Eintrag hat, der gleich 1 in der Originaldatei ist.

Was kann falsch sein?

+0

können Sie zeigen die Ausgabe von 'df_hdf.info()' 'count' zählt die Anzahl der Nicht-NaN Beobachtungen, die ist nicht unbedingt die gleiche wie die Anzahl der Zeilen – EdChum

+0

Sie müssen append = True – Jeff

Antwort

0

Verwenden Sie append=True, um to_hdf anzuweisen, neue Chunks an dieselbe Datei anzuhängen.

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

Andernfalls überschreibt jeder Anruf den vorherigen Inhalt und nur der letzte Brocken bleibt in file_csv.hdf gespeichert.


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) 

druckt

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 

Verwenden append=Trueto_hdf zu sagen, neue Stücke auf die gleiche Datei anhängen. Ansonsten wird nur der letzte Brocken in file_csv.hdf gespeichert:

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) 

druckt

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