使用 Dask 从 CSV 文件中采样确切的行数

Posted

技术标签:

【中文标题】使用 Dask 从 CSV 文件中采样确切的行数【英文标题】:Sample exact number of rows from CSV files using Dask 【发布时间】:2020-06-16 16:31:18 【问题描述】:

我想使用 Dask 创建n 行的子样本。我尝试了两种方法:

1.使用frac:

import dask.dataframe as dd    
read_path = ["test_data\\small1.csv", "test_data\\small2.csv", "huge.csv"]
df = dd.read_csv(read_path)
df = df.sample(frac=0.0001)
df = df.compute()

它的运行速度足够快 - 从 1 亿个数据集中选择 10000 个,持续 16 秒。但它不能保证准确的行数——因为使用了frac,它会被四舍五入。

2.使用for循环:

nrows = 10000
res_df = []
length = csv_loader.get_length()
total_len = sum(length)
start = perf_counter()
inds = random.sample(range(total_len), total_len - nrows - len(length))
min_bound = 0
relative_inds = []
for leng in length:
    relative_inds.append(
        sorted([i - min_bound for i in inds if min_bound <= i < min_bound + leng])
    )
    min_bound += leng
for ind, fil in enumerate(read_path):
    res_df.append(dd.read_csv(fil, skiprows=relative_inds[ind], sample=1000000))

在这里,我计算需要跳过的行的索引,然后使用 skiprows 从 csv 加载。如果我需要从一些小 csv 中读取 0 行,这种方法非常缓慢并且有时会崩溃。但它保证了准确的行数。

有没有使用 Dask 获取准确行数的快速解决方案?

【问题讨论】:

【参考方案1】:

我找到了解决办法:

total_len = get_total_length() #compute len of all data in csvs
frac = nrows / total_len

while int(total_len * frac) != nrows:
    counter = 1
    frac = nrows / (total_len - counter)
    counter += 1

    res_df = dd.read_csv(read_path)
    res_df = res_df.sample(frac=0.0001)
    res_df = res_df.compute()

您可以访问next link观看如何有效计算csv中的行数。

【讨论】:

以上是关于使用 Dask 从 CSV 文件中采样确切的行数的主要内容,如果未能解决你的问题,请参考以下文章

从 len 18000 的 Dask 数据帧中采样 n = 2000 会产生错误 当“replace = False”时无法采用比总体更大的样本

SSIS脚本任务获取csv文件的行数

是否可以从 Dask 读取镶木地板元数据?

从双表中选择确切的行数

Pyspark 的 sqlContext.read.csv() 函数读取的行数比实际 .csv 文件中的行数多

使用 dask.dataframe 从 CSV 文件中按分区读取尾部