python-3.x - 如何从 Dask 中的 zip 文件读取多个 csv 文件?

标签 python-3.x pandas dataframe dask

import dask
import dask.dataframe as dd
from dask.delayed import delayed
import pandas as pd

我使用dask的delayed和read_delay来执行此操作,因为它可以工作并且工作速度很快。这是我的难题...

dfc = [delayed(pd.read_csv)(u)[['UserID', 'ConversionDate']] for u in conversions]
dfs = [delayed(pd.read_csv)(u)[['UserID', 'EventDate']] for u in standard]

这很好用。然后我这样做...

df = dd.from_delayed(dfc)

它给了我一个长度约为 800 万的 dask 数据帧。太好了。但我这样做...

ds = dd.from_delayed(dfs)

我收到以下错误...

ValueError: ('Multiple files found in compressed zip file %s', "['MM_CLD_Standard_Agency_142087_Daily_191101_00.csv', 'MM_CLD_Standard_Agency_142087_Daily_191101_01.csv', 'MM_CLD_Standard_Agency_142087_Daily_191101_02.csv', 'MM_CLD_Standard_Agency_142087_Daily_191101_03.csv', 'MM_CLD_Standard_Agency_142087_Daily_191101_04.csv']")

正如您所看到的,该 zip 文件中有多个 csv。我想像第一个那样轻松提取所有这些 csv。将会有更多的数据,但 dask 应该能够处理它。我该如何去做呢?

此外,之后,我需要在 'UserID' 上左连接 dfds 并重置索引。

请帮忙!谢谢!

最佳答案

好吧,我必须制作一些数据来玩,所以我使用了 this dataset .

import pandas as pd

cols = ["mpg", "cylinders", "displacement", 
        "horsepower", "weight", "acceleration", 
        "model_year", "origin", "car_name"]
df = pd.read_csv("auto-mpg.data", sep="\s+", 
                 header=None, names=cols)

df[:100].to_csv("auto_1.csv")
df[100:200].to_csv("auto_2.csv")
df[200:300].to_csv("auto_3.csv")
df[300:].to_csv("auto_4.csv")

然后我将这些文件压缩成 zip 存档。 (右键单击 -> 压缩。这可以在 zipfile 中完成,但我不知道如何操作。)

接下来,读取压缩文件,并将其中的文件添加到您的 dask 数据帧中。

from zipfile import ZipFile
import dask.dataframe as dd
import os

wd = '/path/to/zip/files'
file_list = os.listdir(wd)
destdir = '/extracted/destination/'

ddf = dd.from_pandas(pd.DataFrame())

for f in file_list:
    with ZipFile(wd + f, "r") as zip:
        print(zip.namelist())
        zip.extractall(destdir, None, None)
        df = dd.read_csv(zip.namelist(), usecols=['Enter', 'Columns', 'Here'], parse_dates=['Date'])
        ddf = ddf.append(df)

ddf.compute()

输出:

['auto_4.csv', 'auto_3.csv', 'auto_2.csv', 'auto_1.csv']
    Unnamed: 0   mpg  cylinders  displacement horsepower  weight  \
0          300  23.9          8         260.0      90.00  3420.0   
1          301  34.2          4         105.0      70.00  2200.0   
2          302  34.5          4         105.0      70.00  2150.0   
3          303  31.8          4          85.0      65.00  2020.0   
4          304  37.3          4          91.0      69.00  2130.0   
5          305  28.4          4         151.0      90.00  2670.0   

如您所见,Unnamed: 0 是原始索引,现在已乱序。您可以删除它,对 ddf 进行排序,等等。

如果其中还有其他文件,您可以使用 glob 进行搜索,或使用列表理解,例如

print([file.namelist() 中的文件的文件,如果文件中为“auto”])

关于python-3.x - 如何从 Dask 中的 zip 文件读取多个 csv 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59168096/

相关文章:

python-3.x - 我怎样才能轻松地创建一个带有逆函数的 python argparse 参数?

python - 相互添加两列

python - Pandas - 在 pd.merge 时为缺失值添加 NaN

python - Groupby 查找上一行之前的值

python - pretty-print 整个 Pandas Series/DataFrame

python - 计算 Pandas 整个数据框中特定字符串的数量,并将其值添加到新列中

python - 从子类中引用非重写父类(super class)方法的约定是什么?

python - 创建一组 numpy 数组

python-3.x - 如果子字符串重叠,如何计算Python中子字符串的数量?

Python Pandas VLOOKUP 函数,具有分类值和非数字值