2012-11-30 7 views
45

パンダを使用してメモリにロードするCSVの行をフィルタするにはどうすればよいですか?これは、read_csvにあるはずのオプションのようです。何か不足していますか?Pandas read_csv関数でどのように行をフィルタリングできますか?

例:タイムスタンプ列を持つCSVがあり、指定された定数よりも長いタイムスタンプを持つ行だけをロードしたいとします。

答えて

82

CSVファイルがpandasオブジェクトに読み込まれる前に行をフィルタするオプションはありません。

df[df['field'] > constant]を使用してファイルをロードしてフィルタリングすることができます。ファイルが非常に大きく、メモリが不足していると思われる場合は、イテレータを使用してファイルの塊を連結するときにフィルタを適用します。

iter_csv = pandas.read_csv('file.csv', iterator=True, chunksize=1000) 
df = pd.concat([chunk[chunk['field'] > constant] for chunk in iter_csv]) 

使用可能なメモリに合わせてchunksizeを変更することができます。詳細はhereを参照してください。

+0

の 'chunk ['filed']> constant'は2つの定数値の間に挟むことができますか?例:constant1>チャンク['field']> constant2。または、「範囲内で」使用できますか? – weefwefwqg3

4

私はread_csvの文脈の中でそれを行うための単純な方法を見つけられませんでした。しかし、read_csvブールベクトルdf[bool_vec]によって行を選択することによってフィルタリングすることができるデータフレームを返す:

filtered = df[(df['timestamp'] > targettime)] 

これはDFのすべての行を選択している(DFは、そのようなread_csv呼び出しの結果として、任意のデータフレーム、と仮定します少なくともtimestamp列の値がtargettimeの値より大きい日時列timestampが含まれています)。 Similar question

0

Linuxをお使いの場合はgrepを使用できます。

# to import either on Python2 or Python3 
import pandas as pd 
from time import time # not needed just for timing 
try: 
    from StringIO import StringIO 
except ImportError: 
    from io import StringIO 


def zgrep_data(f, string): 
    '''grep multiple items f is filepath, string is what you are filtering for''' 

    grep = 'grep' # change to zgrep for gzipped files 
    print('{} for {} from {}'.format(grep,string,f)) 
    start_time = time() 
    if string == '': 
     out = subprocess.check_output([grep, string, f]) 
     grep_data = StringIO(out) 
     data = pd.read_csv(grep_data, sep=',', header=0) 

    else: 
     # read only the first row to get the columns. May need to change depending on 
     # how the data is stored 
     columns = pd.read_csv(f, sep=',', nrows=1, header=None).values.tolist()[0]  

     out = subprocess.check_output([grep, string, f]) 
     grep_data = StringIO(out) 

     data = pd.read_csv(grep_data, sep=',', names=columns, header=None) 

    print('{} finished for {} - {} seconds'.format(grep,f,time()-start_time)) 
    return data 
関連する問題