【问题标题】:TypeError when using chunksize argument to pandas method pd.read_csv()使用 pandas 方法 pd.read_csv() 的 chunksize 参数时出现 TypeError
【发布时间】:2019-05-07 11:44:12
【问题描述】:

我有一个这样的 csv 文件:

   1  1.1  0      0.1  13.1494  32.7957  2.27266  0.2  3  5.4   ...     \
0  2    2  0  8.17680  4.76726  25.6957  1.13633    0  3  4.8   ...      
1  3    0  0  8.22718  2.35340  15.2934  1.13633    0  3  4.8   ...

使用 panda.read_csv 读取文件:

data_raw = pd.read_csv(filename, chunksize=chunksize)

现在,我想做一个数据框:

df = pd.DataFrame(data_raw, columns=['id', 'colNam1', 'colNam2', 'colNam3',...])

但是我遇到了一个问题:

  File "test.py", line 143, in <module>
    data = load_frame(csvfile)
  File "test.py", line 53, in load_frame
    'id', 'colNam1', 'colNam2', 'colNam3',...])
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 325, in __init__
    raise TypeError("data argument can't be an iterator")
TypeError: data argument can't be an iterator

我不知道为什么。

【问题讨论】:

    标签: pandas


    【解决方案1】:

    这是因为当您将 chunksize 作为参数传递给 read_csv 时返回的是可迭代的,而不是像这样的 df。

    演示:

    In [67]:
    import io
    import pandas as pd
    t="""a         b
    0 -0.278303 -1.625377
    1 -1.954218  0.843397
    2  1.213572 -0.098594"""
    df = pd.read_csv(io.StringIO(t), chunksize=1)
    df
    
    Out[67]:
    <pandas.io.parsers.TextFileReader at 0x7e9e8d0>
    

    您可以看到这里的df 在这种情况下不是 DataFrame 而是 TextFileReader 对象

    我不清楚你真正想要实现什么,但如果你想读取特定数量的行,你可以通过 nrows 代替:

    In [69]:
    t="""a         b
    0 -0.278303 -1.625377
    1 -1.954218  0.843397
    2  1.213572 -0.098594"""
    df = pd.read_csv(io.StringIO(t), nrows=1)
    df
    
    Out[69]:
                 a         b
    0  0 -0.278303 -1.625377
    

    你原来的问题的想法是你需要迭代它才能得到块:

    In [73]:
    for r in df:
        print(r)
    
                 a         b
    0  0 -0.278303 -1.625377
                 a         b
    1  1 -1.954218  0.843397
                 a         b
    2  2  1.213572 -0.098594
    

    如果您想从需要附加到列表的块中生成 df,然后调用 concat:

    In [77]:
    df_list=[]
    for r in df:
        df_list.append(r)
    pd.concat(df_list)
    
    Out[77]:
                 a         b
    0  0 -0.278303 -1.625377
    1  1 -1.954218  0.843397
    2  2  1.213572 -0.098594
    

    【讨论】:

    • 谢谢。但是,如果我想将数据放入 DataFrame,我该怎么办?电脑的内存只有 3GB。
    • 非常感谢。我想从块中生成一个 df 。我已经使用了你的 df_list 代码。但是由于内存已满,该进程被终止。我的电脑内存只有 3GB。但 CSV 文件超过 3GB。你有答案吗?
    • 嗯,你需要更多的内存或者你需要考虑热来处理一个 csv 离线。你不能在这里打破物理定律,如果你没有足够的内存,那么你需要分块处理文件或考虑你真正需要在内存中加载什么
    • 你能举一些我目前情况下的具体例子吗?如何从块或离线 csv 中生成 df?谢谢。
    • 对不起,这是一个不同的问题,你应该接受我的回答并发布一个新问题,关键是你需要在你的问题中包含你正在尝试做的事情,因为你可能能够处理 csv -line 或减少内存占用,但对我来说这是一个单独的问题
    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 2020-08-09
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多