2015-01-30 18 views
5

Yalnızca satırların bir alt kümesiyle ilgilendiğim büyük csvs'lere sahibim. Özellikle, belirli bir koşul yerine getirilmeden önce ortaya çıkan tüm satırları okumak isterim. read_csv dataframe vermesi durumunda tampandalarda csv koşullu satır okuması

Örneğin:

 A B  C 
1 34 3.20 'b' 
2 24 9.21 'b' 
3 34 3.32 'c' 
4 24 24.3 'c' 
5 35 1.12 'a' 
... 
1e9 42 2.15 'd' 

sütun B Yukarıdaki örnekte 10. aşana kadar CSV tüm satırları okumak için bir yolu yoktur, Okumayı istiyorum içinde:

 A B  C 
1 34 3.20 'b' 
2 24 9.21 'b' 
3 34 3.32 'c' 
4 24 24.3 'c' 

ben de dataframe okudum bir kez bu satırları atmak nasıl biliyorum ama bu noktada ben zaten bunları okurken bütün bu hesaplama harcadım ben dizine erişimi yok. csv okumadan önce son satırın (skipfooter lütfen)

+1

Pandas API'sinde bunu yapmanın basit bir yolu olduğunu sanmıyorum. Muhtemelen sadece csv'yi kesmeniz, satırları birer birer tutmanız, listelerin bir listesini yapmaları, istediğiniz son satırı almanızın ardından durmanız ve daha sonra bir "DataFrame" inizi kurmanız gerekecek. sonuç listeleri listesi. –

+1

Csv'leri yığınlar halinde okuyabilir ve yalnızca alt küme koşulunuzu karşılarsa eklersiniz – EdChum

cevap

12

Csv'yi yığınlar halinde okuyabilirsiniz. pd.read_csv, chunksize parametresi belirtildiğinde bir yineleyici döndürdüğünden, itertools.takewhile, tüm dosyayı okumadan, yalnızca istediğiniz kadar çok parçayı okumak için kullanabilirsiniz.

import itertools as IT 
import pandas as pd 

chunksize = 10 ** 5 
chunks = pd.read_csv(filename, chunksize=chunksize, header=None) 
chunks = IT.takewhile(lambda chunk: chunk['B'].iloc[-1] < 10, chunks) 
df = pd.concat(chunks) 
mask = df['B'] < 10 
df = df.loc[mask] 

Veya son yığın istenmeyen satırları kaldırmak için df.loc[mask] kullanmak zorunda kalmamak için, belki de daha temiz bir çözüm, özel bir jeneratör tanımlamak olacaktır:

import itertools as IT 
import pandas as pd 

def valid(chunks): 
    for chunk in chunks: 
     mask = chunk['B'] < 10 
     if mask.all(): 
      yield chunk 
     else: 
      yield chunk.loc[mask] 
      break 

chunksize = 10 ** 5 
chunks = pd.read_csv(filename, chunksize=chunksize, header=None) 
df = pd.concat(valid(chunks)) 
+0

@DSM: "chunk.ix [-1, 'B']' anlamına mı geliyor? – unutbu

+0

@DSM: Teşekkürler, haklısınız. 'Chunk.ix [-1, 'B']' bile 'chunk' indeksinin -1 değerini içermesi durumunda yanlış değeri döndürür. – unutbu