python - 分块读取 Pandas 中的多个 CSV 文件

标签 python pandas jupyter-notebook sklearn-pandas

当我们有多个 csv 文件并且所有 csv 的总大小约为 20gb 时,如何分块导入和读取多个 CSV?

我不想使用 Spark,因为我想在 SkLearn 中使用模型,所以我想在 Pandas 本身中找到解决方案。

我的代码是:

allFiles = glob.glob(os.path.join(path, "*.csv"))
df = pd.concat((pd.read_csv(f,sep=",") for f in allFiles))
df.reset_index(drop=True, inplace=True)

但这失败了,因为我路径中所有 csv 的总大小为 17gb。

我想分块阅读,但如果我这样尝试会出现一些错误:

  allFiles = glob.glob(os.path.join(path, "*.csv"))
  df = pd.concat((pd.read_csv(f,sep=",",chunksize=10000) for f in allFiles))
  df.reset_index(drop=True, inplace=True)

我得到的错误是这样的:

"cannot concatenate object of type ""; only pd.Series, pd.DataFrame, and pd.Panel (deprecated) objs are valid"

有人可以帮忙吗?

最佳答案

要读取大型 csv 文件,您可以使用 chunksize 但在这种情况下,您必须像这样使用迭代器:

for df in pd.read_csv('file.csv', sep=',', iterator=True, chunksize=10000):
    process(df)

你必须连接或追加每个 block

或者你可以这样做:

df = pd.read_csv('file.csv',, sep=',', iterator=True, chunksize=10000)
for chunk in df:
    process(chunk)

读取多个文件:例如

listfile = ['file1,'file2]
dfx = pd.DataFrame()
def process(d):
    #dfx=dfx.append(d) or dfx = pd.concat(dfx, d)
    #other coding

for f in listfile:
    for df in pd.read_csv(f, sep=',', iterator=True, chunksize=10000):
        process(df)

当你有很多文件后,你可以使用多处理库中的 DASK 或 Pool 来启动大量读取过程

反正要么你内存够,要么你浪费时间

关于python - 分块读取 Pandas 中的多个 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54987682/

相关文章:

python正则表达式匹配确切的词

python-2.7 - 将 Pandas 系列中的字符串转换为小写时遇到问题

python - Jupyter 笔记本内核未连接

python - 循环日期范围子+将天分配给各自的月份

python - 如何从带有附加分隔符的 csv 在 python 中创建 pandas 数据框?

python - 我可以在 MacOS 上安装 Anaconda 来覆盖损坏的 Anaconda 安装吗?

python - 如何隐藏代码并重新运行 jupyter notebook 中的所有单元格?

python - 将函数列表(带参数)作为 python 中的输入

python - 在 linux 机器中获取 astimezone 错误

python - np.timedelta64 到天、周、月等的转换