pandas を使用して CSV のどの行をメモリにロードするかをフィルタリングするにはどうすればよいですか? これは、 にあるオプションのようread_csv
です。何か不足していますか?
例: タイムスタンプ列を持つ CSV があり、特定の定数より大きいタイムスタンプを持つ行だけを読み込みたいとします。
CSV ファイルが pandas オブジェクトに読み込まれる前に行をフィルター処理するオプションはありません。
ファイルをロードしてから を使用してフィルタリングするdf[df['field'] > constant]
か、非常に大きなファイルがあり、メモリ不足が心配な場合は、イテレータを使用して、ファイルのチャンクを連結するときにフィルタを適用します。
import pandas as pd
iter_csv = pd.read_csv('file.csv', iterator=True, chunksize=1000)
df = pd.concat([chunk[chunk['field'] > constant] for chunk in iter_csv])
chunksize
使用可能なメモリに合わせて を変更できます。詳しくはこちらをご覧ください。
のコンテキスト内でそれを行う簡単な方法が見つかりませんでしたread_csv
。ただし、read_csv
ブール値ベクトルで行を選択することでフィルタリングできる DataFrame を返しますdf[bool_vec]
。
filtered = df[(df['timestamp'] > targettime)]
これは、列の値が targettime の値よりも大きいdf 内のすべての行を選択しています (df は、read_csv
呼び出しの結果など、少なくとも datetime column を含む任意の DataFrame であると仮定しますtimestamp
) 。同様の質問。timestamp
受け入れられた答えに代わるものは、入力ファイルをフィルタリングして取得した StringIO に read_csv() を適用することです。
with open(<file>) as f:
text = "\n".join([line for line in f if <condition>])
df = pd.read_csv(StringIO(text))
このソリューションは、フィルタリング条件が行のごく一部しか保持しない場合、受け入れられた回答よりも高速であることがよくあります。