2017-04-17 59 views
4

我有一個很大的csv文件,由於內存問題,我無法使用read_csv()加載到DataFrame中。然而,在csv的第一列中有一個{0,1}標誌,我只需要加載一個'1'的行,這個行很容易就足夠小以適應DataFrame。有什麼方法可以在條件下加載數據,或者在加載之前操作csv(類似於grep)?在加載到熊貓數據框之前從CSV中過濾出行

+0

您可以輕鬆地在該列上過濾新的csv,否? –

回答

7

您可以使用pd.read_csvscomment參數,並將其設置爲'0'

import pandas as pd 
from io import StringIO 

txt = """col1,col2 
1,a 
0,b 
1,c 
0,d""" 

pd.read_csv(StringIO(txt), comment='0') 

    col1 col2 
0  1 a 
1  1 c 

您還可以使用chunksizepd.read_csv成一個迭代器和處理它與querypd.concat
注:作爲OP指出,塊大小1是不現實的。我僅用於演示目的。請增加它以適應個人需求。

pd.concat([df.query('col1 == 1') for df in pd.read_csv(StringIO(txt), chunksize=1)]) 
# Equivalent to and slower than... use the commented line for better performance 
# pd.concat([df[df.col1 == 1] for df in pd.read_csv(StringIO(txt), chunksize=1)]) 

    col1 col2 
0  1 a 
2  1 c 
+1

非常聰明!嘿,當然,但聰明! –

+2

@ juanpa.arrivillaga你在說什麼,就像它打算用於:-) – piRSquared

+0

我試圖推廣這個問題,但實際上我在文檔中間使用了一個字符串。註釋字段完全回答了我的問題,但受限於它只能在文件開頭的單個字符上使用。 concat解決方案完美地工作,雖然我增加了大塊 - 1太慢了。我還需要添加low_memory = False來解決一些data_type問題。 mdms = pd.concat([df.query('Pool ==「FX」')for df in pd.read_csv(mtms,chunksize = 1000,low_memory = False)]) – ibav