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'
上左连接 df
和 ds
并重置索引。
请帮忙!谢谢!
最佳答案
好吧,我必须制作一些数据来玩,所以我使用了 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/