0

我想从 Dask 系列中随机抽取 k 值而不进行替换,并且我不想事先计算系列的长度。如果 k 大于系列的长度,那么我想返回整个系列。

我已经尝试过 dask 系列示例函数,但它无法将延迟对象作为frac参数处理:

df = pd.DataFrame({"A": [0, 1, 2]})
ddf = dd.from_pandas(df, npartitions=1)
ds = ddf["A"]

k = 2
sampled_series = ds.sample(frac=k / ds.shape[0])
sampled_series.compute()

给出错误

TypeError: 试图将 dd.Scalar<lt-3dc6..., dtype=bool> 转换为布尔值...

我也尝试从 dask bag 采样,但是当 k 大于 bag 的长度时会引发错误:

df = pd.DataFrame({"A": [0, 1, 2]})
ddf = dd.from_pandas(df, npartitions=1)
ds = ddf["A"]

sample = random.sample(ds.to_bag(), k=4)
sample.compute()

给出错误

例外:ValueError('样本大于总体或为负')

有什么办法可以得到我想要的结果?

4

2 回答 2

1

在我看来,这df.shape是一个延迟的对象,可能会给你带来问题。

我试过了,它正在工作

import pandas as pd
import numpy as np
import dask.dataframe as dd

df = pd.DataFrame({"A": np.arange(10)})

df =  dd.from_pandas(df, npartitions=2)

df_sampled = df.sample(frac=0.2) # I want 20% of the data
于 2020-08-02T01:14:46.370 回答
0

感谢@rpanai 的建议,对我来说一个足够的解决方案是从每个分区中采样。例如

df = pd.DataFrame({"A": [0, 1, 2]})
ddf = dd.from_pandas(df, npartitions=1)
ds = ddf["A"]

k = 2
sampled_series = ds.map_partitions(lambda x: x.sample(n=min(k, x.shape[0]), meta=ds)
sampled_series.compute()
于 2020-08-03T04:12:27.767 回答