【问题标题】:Why does Pandas read_CSV return TextFileReader even if iterator = False?为什么即使 iterator = False,Pandas read_CSV 也会返回 TextFileReader?
【发布时间】:2021-08-15 20:10:41
【问题描述】:

环境: 蟒蛇:3.7.10.final.0, 蟒蛇位:64, 操作系统:Windows,64GB 内存, 操作系统版本:10, 版本:10.0.19041, 熊猫:1.2.4

在一个简单的打印语句之后我有一个非常简单的读取语句,并且有条件检查我是否确实要读取整个文件...

%timeit csvDataFrame = pd.read_csv(fc.selected, sep=",", header='infer', na_values ='?', skiprows=csvSkipRows, dtype=desiDtypesDict, comment = '#', iterator=False)

其中 fc.selected 是大约 200 万行(磁盘上 524MB)的 CSV 的完整路径; csvSkipRows = [] 和 desiDtypesDict 是数据集中列的类型字典。

如果我还添加例如 CSV 读取工作正常chunksize = 10,并对结果进行迭代,所以我对参数很有信心,但是当我尝试一次读取整个文件时

  • %timeit 告诉我它需要大约 6 秒/循环并且有 7 个循环
  • csvDataFrame 不是数据帧,而是 TextFileReader

即使迭代器 = False 在这种环境下,Python 访问大量内存通常没有问题,因此:

为什么会发生这种情况,以及如何一次读取 CSV?

【问题讨论】:

    标签: pandas jupyter-notebook jupyter-lab timeit


    【解决方案1】:

    为什么会这样? %timeit 与 pandas 发生了奇怪的互动*

    如何一次读取 CSV? 省略 %timeit

    一个新的内核和稍后的小修改,我们发现问题是由于将 %timeit 放在 read_csv 之前。

    删除它,总时间相同,但现在返回单个数据帧,2684511 行 × 31 列,符合预期和期望。

    建议:在推断确实存在问题之前,始终使用最少的代码进行测试。

    * 确切地我不知道交互是什么......也许其他人会这样做。

    完整的单元格代码是:

    # Read all at once.
    print(readCSVAllAtOnce)
    
    if readCSVAllAtOnce:
        %timeit csvDataFrame = pd.read_csv(fc.selected, sep=",", header='infer', na_values ='?', skiprows=csvSkipRows, dtype=desiDtypesDict, comment = '#', iterator=False, chunksize=None)
    

    【讨论】:

      猜你喜欢
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 2018-08-13
      相关资源
      最近更新 更多