【问题标题】:Filter out rows from CSV before loading to pandas dataframe在加载到熊猫数据框之前从 CSV 中过滤掉行
【发布时间】:2017-09-13 15:29:08
【问题描述】:

我有一个大的 csv 文件,由于内存问题,我无法使用 read_csv() 将其加载到 DataFrame 中。但是,在 csv 的第一列中有一个 {0,1} 标志,我只需要加载带有“1”的行,它很容易小到可以放入 DataFrame 中。有什么方法可以加载带有条件的数据,或者在加载之前操纵 csv(类似于 grep)?

【问题讨论】:

  • 您可以轻松地在该列上过滤新的 csv,不是吗?

标签: python python-2.7 csv pandas


【解决方案1】:

您可以使用pd.read_csvscomment参数并将其设置为'0'

import pandas as pd
from io import StringIO

txt = """col1,col2
1,a
0,b
1,c
0,d"""

pd.read_csv(StringIO(txt), comment='0')

   col1 col2
0     1    a
1     1    c

您还可以使用chunksizepd.read_csv 转换为迭代器并使用querypd.concat 处理它
注意: OP 指出,1 的块大小是不现实的。我仅将其用于演示目的。请根据个人需要增加。

pd.concat([df.query('col1 == 1') for df in pd.read_csv(StringIO(txt), chunksize=1)])
# Equivalent to and slower than... use the commented line for better performance
# pd.concat([df[df.col1 == 1] for df in pd.read_csv(StringIO(txt), chunksize=1)])

   col1 col2
0     1    a
2     1    c

【讨论】:

  • @juanpa.arrivillaga 你在说什么,就像它打算被使用一样:-)
  • 我试图概括这个问题,但实际上过滤器我在文档中间使用了一个字符串。评论字段准确地回答了我的问题,但仅限于它仅适用于文件开头的单个字符。 concat 解决方案效果很好,尽管我增加了 chunksize - 1 太慢了。我还需要添加 low_memory = False 来解决一些 data_type 问题。 mtms = pd.concat([df.query('Pool=="FX"') for df in pd.read_csv(mtms, chunksize=1000, low_memory = False)])
  • @ibav 是的!请增加块大小。 1 用于演示目的。
猜你喜欢
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多