120

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

例: タイムスタンプ列を持つ CSV があり、特定の定数より大きいタイムスタンプを持つ行だけを読み込みたいとします。

4

7 に答える 7

204

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使用可能なメモリに合わせて を変更できます。詳しくはこちらをご覧ください。

于 2012-11-30T21:31:28.067 に答える
10

のコンテキスト内でそれを行う簡単な方法が見つかりませんでしたread_csv。ただし、read_csvブール値ベクトルで行を選択することでフィルタリングできる DataFrame を返しますdf[bool_vec]

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

これは、列の値が targettime の値よりも大きいdf 内のすべての行を選択しています (df は、read_csv呼び出しの結果など、少なくとも datetime column を含む任意の DataFrame であると仮定しますtimestamp) 。同様の質問timestamp

于 2012-11-30T19:43:40.377 に答える
1

受け入れられた答えに代わるものは、入力ファイルをフィルタリングして取得した StringIO に read_csv() を適用することです。

with open(<file>) as f:
    text = "\n".join([line for line in f if <condition>])

df = pd.read_csv(StringIO(text))

このソリューションは、フィルタリング条件が行のごく一部しか保持しない場合、受け入れられた回答よりも高速であることがよくあります。

于 2020-10-11T21:13:14.847 に答える