パンダを使用してメモリにロードするCSVの行をフィルタするにはどうすればよいですか?これは、read_csv
にあるはずのオプションのようです。何か不足していますか?Pandas read_csv関数でどのように行をフィルタリングできますか?
例:タイムスタンプ列を持つCSVがあり、指定された定数よりも長いタイムスタンプを持つ行だけをロードしたいとします。
パンダを使用してメモリにロードするCSVの行をフィルタするにはどうすればよいですか?これは、read_csv
にあるはずのオプションのようです。何か不足していますか?Pandas read_csv関数でどのように行をフィルタリングできますか?
例:タイムスタンプ列を持つCSVがあり、指定された定数よりも長いタイムスタンプを持つ行だけをロードしたいとします。
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を参照してください。
私はread_csv
の文脈の中でそれを行うための単純な方法を見つけられませんでした。しかし、read_csv
ブールベクトルdf[bool_vec]
によって行を選択することによってフィルタリングすることができるデータフレームを返す:
filtered = df[(df['timestamp'] > targettime)]
これはDFのすべての行を選択している(DFは、そのようなread_csv
呼び出しの結果として、任意のデータフレーム、と仮定します少なくともtimestamp
列の値がtargettimeの値より大きい日時列timestamp
が含まれています)。 Similar question。
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
の 'chunk ['filed']> constant'は2つの定数値の間に挟むことができますか?例:constant1>チャンク['field']> constant2。または、「範囲内で」使用できますか? – weefwefwqg3