当前位置: 首页 > 知识库问答 >
问题:

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

段干弘扬
2023-03-14

我想使用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()

它的工作速度足够快-从100mil数据集中选择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个答案

韩佐
2023-03-14

我找到了解决办法:

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()

您可以查看如何有效地计算csv访问下一个链接中的行数。

 类似资料:
  • 我将有n个(不是固定的文件数)数量的csv文件,这些文件应该作为输入传递给http采样器请求。计划是所有线程都应该从csv file1和file2读取数据...直到文件。不应为任何线程读取任何重复的数据。 目前,我有一个jmeter脚本可以从一个csv文件中读取数据,它工作得很好,所以必须将其扩展到从多个csv文件中读取数据。

  • 我有一个包含CSV文件的目录。每个文件都包含我想用JMeter发出的GET请求列表。我想要做的是读取一个目录中的所有文件,然后循环通过每个CSV在JMeter中发送请求。文件的数量不一致,所以我不想将文件名硬编码到CSV采样器中。 因此,实际上,我希望读取目录中的所有文件,并将这些文件存储在一个数组变量中。循环遍历数组并将CSV文件发送给CSV采样器,然后CSV采样器读取CSV文件并将内容传递给H

  • 如果我在IntelliJ IDE中测试这一点,只需将writeLine方法包装到main方法中,就可以正常工作 我的问题是:groovy sampler是否理解Java(在我看到的一篇文章中提到groovy理解99%的Java语法)。曾经有人成功地使用JMeter将数据写入csv文件吗?

  • 我想比较两种excel文件单元格样式。通过使用apache poi,我如何逐个单元格比较样式?而且我还需要哪种风格是不匹配的,像对齐或大胆或颜色…等。这意味着不匹配的样式应该是字符串(样式名-align,color...)

  • 问题内容: 我有一个CSV文件,下面是其外观示例: 我知道如何读取文件并打印每列(例如- )。但是我真正想做的是读取行,就像这样,然后依此类推。 然后,我想将这些数字存储到变量中,以便稍后将它们总计(例如): 。那我可以做。 我将如何在Python 3中做到这一点? 问题答案: 您可以执行以下操作: 要么 : 编辑:

  • 问题内容: 我只想删除第三行中值为‘0’的行。数据示例如下: 因此,第一行将需要删除,而第二行将保留。 到目前为止,我所拥有的如下: 任何帮助都会很棒 问题答案: 你很亲密 目前,您将整数与进行比较,然后将其与字符串进行比较。当您从文件中读取数据时,它是一个字符串而不是整数,因此这就是您的整数检查当前失败的原因: 另外,您可以使用关键字使当前代码略显pythonic,从而减少代码中的行,并且可以省