对pandas方法使用chunksize参数时的TypeError pd.read_csv()

时间:2017-01-25 04:22:20

标签: pandas

我有一个像这样的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

我不知道为什么。

1 个答案:

答案 0 :(得分: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