如何在Pandas read_csv函数中过滤加载行?

ben*_*son 85 python pandas

如何使用pandas过滤哪些CSV行加载到内存中?这似乎是一个应该找到的选项read_csv.我错过了什么吗?

示例:我们有一个带有时间戳列的CSV,我们只想加载时间戳大于给定常量的行.

Mat*_*ohn 142

在将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])
Run Code Online (Sandbox Code Playgroud)

您可以改变它chunksize以适应您的可用内存.有关详细信息,请参见此处


Gri*_*fin 7

我没有找到一种直接的方式来做到这一点read_csv.但是,read_csv返回一个DataFrame,可以通过布尔向量选择行来过滤df[bool_vec]:

filtered = df[(df['timestamp'] > targettime)]
Run Code Online (Sandbox Code Playgroud)

这是选择df中的所有行(假设df是任何DataFrame,例如read_csv调用的结果,至少包含datetime列timestamp),其中timestamp列中的值大于targettime的值.类似的问题.

  • 我对此不太确定,但我感觉这会占用大量内存。 (2认同)
  • 问题是关于在加载时过滤数据,我不知道为什么这么多人赞成这个答案。 (2认同)

M. *_*age 6

接受答案的替代方法是将 read_csv() 应用于通过过滤输入文件获得的 StringIO。

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

df = pd.read_csv(StringIO(text))
Run Code Online (Sandbox Code Playgroud)

当过滤条件仅保留一小部分行时,此解决方案通常比接受的答案更快