如何使用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以适应您的可用内存.有关详细信息,请参见此处
我没有找到一种直接的方式来做到这一点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的值.类似的问题.
接受答案的替代方法是将 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)
当过滤条件仅保留一小部分行时,此解决方案通常比接受的答案更快
| 归档时间: |
|
| 查看次数: |
54918 次 |
| 最近记录: |