如何从Dask的zip文件中读取多个csv文件?

时间:2019-12-04 02:27:03

标签: python-3.x pandas dataframe dask

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

我正在使用dask的delay和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万个长度的数据帧。好,很好。但是我这样做...

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。将会有更多的数据,但是敏捷应该能够处理它。我该怎么做?

此外,在那之后,我需要离开df上的ds'UserID'并重新设置索引。

请帮助!谢谢!

1 个答案:

答案 0 :(得分:1)

好的,我必须制作一些数据才能使用,所以我使用了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 for file in file.namelist() if "auto" in file])