为什么移除 Chunksize 时会出错?

0 投票
1 回答
26 浏览
提问于 2025-04-12 14:12

我在运行我的Python代码时遇到了一个错误,需要帮助来解决它。以下是相关的细节:

import pandas as pd

df_list = []
file_path = 'houses.txt'

for chunk in pd.read_csv(file_path, chunksize=1000000, names=['Size()sqft', 'No of bedrooms', 'No of floors', 'Age of home', 'Price(1000s dollar)']):
    df_list.append(chunk)

df = pd.concat(df_list)

print(df_list)

输出结果:

0        952.0             2.0           1.0         65.0                271.5
1       1244.0             3.0           1.0         64.0                300.0
2       1947.0             3.0           2.0         17.0                509.8
3       1725.0             3.0           2.0         42.0                394.0
4       1959.0             3.0           2.0         15.0                540.0
..         ...             ...           ...          ...                  ...
95      1224.0             2.0           2.0         12.0                329.0
96      1432.0             2.0           1.0         43.0                388.0
97      1660.0             3.0           2.0         19.0                390.0
98      1212.0             3.0           1.0         20.0                356.0
99      1050.0             2.0           1.0         65.0                257.8

[100 rows x 5 columns]]

在去掉'chunksize'之后,我得到了这个错误:

TypeError: 不能连接类型为 '<class 'str'>' 的对象;只有Series和DataFrame对象是有效的

请帮我解释一下这个问题是什么。

1 个回答

1

chunksize 是一个参数,它让你可以把读取文件的方式变成一种可以逐块处理的形式。这样,调用 read_csv 函数时,它会返回一个 TextFileReader 对象,你可以通过这个对象来逐行读取文件。

chunksize : int, optional
这个参数指定每次从文件中读取多少行。设置这个值后,函数会返回一个 TextFileReader 对象,方便你进行迭代。想了解更多关于 iteratorchunksize 的信息,可以查看 IO工具文档

如果你不设置 chunksize,函数会直接返回一个 DataFrame 对象。

所以,如果你去掉 chunksize,就不会有逐块处理的效果了。在你的 for 循环中,你处理的对象就不再是 TextFileReader,而是其他类型的对象,这样会导致你在调用 pd.concat 时出现错误,因为 df_list 中的对象类型也会不同。

在某些情况下,分块读取文件是很有用的,特别是当你担心响应速度或内存使用时,或者当你不需要整个数据框时。但如果你不需要分块处理,想要一次性读取整个数据框,可以直接读取整个文件,而不需要进行迭代和后续的合并:

df = pd.read_csv(file_path, names=['Size()sqft', 'No of bedrooms', 'No of floors', 'Age of home', 'Price(1000s dollar)'])

撰写回答