2016-08-20 15 views
5

Mam dużego pliku csv i otworzyć go z pd.read_csv jak następuje:otwarte wybrane wiersze z pand używając „chunksize” i/lub „iterator”

df = pd.read_csv(path//fileName.csv, sep = ' ', header = None) 

Gdy plik jest naprawdę duży I chciałoby być w stanie otworzyć go w rzędach

from 0 to 511 
from 512 to 1023 
from 1024 to 1535 
... 
from 512*n to 512*(n+1) - 1 

gdzie n = 1, 2, 3 ...

Jeśli dodać chunksize = 512 na argumentach read_csv

df = pd.read_csv(path//fileName.csv, sep = ' ', header = None, chunksize = 512) 

i typ

df.get_chunk(5) 

niż ja w stanie otworzyć wiersze od 0 do 5, lub może być w stanie rozdzielić plik w częściach 512 rzędów za pomocą pętli

data = [] 
for chunks in df: 
    data = data + [chunk] 

Jest to jednak zupełnie bezużyteczne, ponieważ plik musi być całkowicie otwarty i wymaga czasu. Jak mogę czytać tylko wiersze od 512 * n do 512 * (n + 1).

Rozglądając Często widziałem, że „chunksize” jest używany razem z „iterator”, jak wynika

df = pd.read_csv(path//fileName.csv, sep = ' ', header = None, iterator = True, chunksize = 512) 

Ale po wielu próbach nadal nie rozumieją korzyści, które dostarczają mi tę zmienną logiczną. Czy możesz mi to wyjaśnić?

Odpowiedz

6

Jak mogę odczytać tylko wiersze od 512 * n do 512 * (n + 1)?

df = pd.read_csv(fn, header=None, skiprows=512*n, nrows=512) 

Można zrobić to w ten sposób (i to całkiem przydatne):

for chunk in pd.read_csv(f, sep = ' ', header = None, chunksize = 512): 
    # process your chunk here 

Demo:

In [61]: fn = 'd:/temp/a.csv' 

In [62]: pd.DataFrame(np.random.randn(30, 3), columns=list('abc')).to_csv(fn, index=False) 

In [63]: for chunk in pd.read_csv(fn, chunksize=10): 
    ....:  print(chunk) 
    ....: 
      a   b   c 
0 2.229657 -1.040086 1.295774 
1 0.358098 -1.080557 -0.396338 
2 0.731741 -0.690453 0.126648 
3 -0.009388 -1.549381 0.913128 
4 -0.256654 -0.073549 -0.171606 
5 0.849934 0.305337 2.360101 
6 -1.472184 0.641512 -1.301492 
7 -2.302152 0.417787 0.485958 
8 0.492314 0.603309 0.890524 
9 -0.730400 0.835873 1.313114 
      a   b   c 
0 1.393865 -1.115267 1.194747 
1 3.038719 -0.343875 -1.410834 
2 -1.510598 0.664154 -0.996762 
3 -0.528211 1.269363 0.506728 
4 0.043785 -0.786499 -1.073502 
5 1.096647 -1.127002 0.918172 
6 -0.792251 -0.652996 -1.000921 
7 1.582166 -0.819374 0.247077 
8 -1.022418 -0.577469 0.097406 
9 -0.274233 -0.244890 -0.352108 
      a   b   c 
0 -0.317418 0.774854 -0.203939 
1 0.205443 0.820302 -2.637387 
2 0.332696 -0.655431 -0.089120 
3 -0.884916 0.274854 1.074991 
4 0.412295 -1.561943 -0.850376 
5 -1.933529 -1.346236 -1.789500 
6 1.652446 -0.800644 -0.126594 
7 0.520916 -0.825257 -0.475727 
8 -2.261692 2.827894 -0.439698 
9 -0.424714 1.862145 1.103926 

W tym przypadku określenie "iterator" może być przydatna?

przy użyciu chunksize - wszystkie porcje będą miały taką samą długość. Korzystanie iterator parametru można określić, ile danych (get_chunk(nrows)) chcesz przeczytać w każdej iteracji:

In [66]: reader = pd.read_csv(fn, iterator=True) 

niech czytać pierwsze 3 rzędy

In [67]: reader.get_chunk(3) 
Out[67]: 
      a   b   c 
0 2.229657 -1.040086 1.295774 
1 0.358098 -1.080557 -0.396338 
2 0.731741 -0.690453 0.126648 

teraz będziemy czytać kolejne 5 rzędów:

In [68]: reader.get_chunk(5) 
Out[68]: 
      a   b   c 
0 -0.009388 -1.549381 0.913128 
1 -0.256654 -0.073549 -0.171606 
2 0.849934 0.305337 2.360101 
3 -1.472184 0.641512 -1.301492 
4 -2.302152 0.417787 0.485958 

kolejne 7 rzędów:

In [69]: reader.get_chunk(7) 
Out[69]: 
      a   b   c 
0 0.492314 0.603309 0.890524 
1 -0.730400 0.835873 1.313114 
2 1.393865 -1.115267 1.194747 
3 3.038719 -0.343875 -1.410834 
4 -1.510598 0.664154 -0.996762 
5 -0.528211 1.269363 0.506728 
6 0.043785 -0.786499 -1.073502 
+0

Nie muszę niczego scalać, wystarczy otworzyć wiersze od powiedzeń ... 512 * 10 do 512 * 11 -1, bez otwierania czegokolwiek innego, czy to możliwe? –

+0

Skopiowałem i przeszłam twój kod na moim IPythonie i próbowałem raz z "iterator = True" i innym razem z "iterator = False", nie ma między nimi żadnej różnicy. W takim przypadku "iterator" może być przydatny? –

+0

@StefanoFedele, zaktualizowałem swoją odpowiedź na przykładzie, który powinien wyjaśnić różnicę między 'chunksize' a' iterator' ... – MaxU