你能从 Dask 系列中随机抽取 k 个值吗?
Can you randomly sample k values from a Dask series?
我想从 Dask 系列中随机抽取 k 个值而不进行替换,并且我不想事先计算系列的长度。如果 k 大于系列的长度,那么我想要 return 整个系列。
我试过 dask 系列 sample function,但它无法处理 delayed 对象作为 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: Trying to convert dd.Scalar<lt-3dc6..., dtype=bool> to a boolean value...
我也试过sample from a dask bag,但是当k大于包的长度时会报错:
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()
报错
Exception: ValueError('Sample larger than population or is negative')
有什么方法可以得到我想要的结果吗?
在我看来 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
感谢@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()
我想从 Dask 系列中随机抽取 k 个值而不进行替换,并且我不想事先计算系列的长度。如果 k 大于系列的长度,那么我想要 return 整个系列。
我试过 dask 系列 sample function,但它无法处理 delayed 对象作为 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: Trying to convert dd.Scalar<lt-3dc6..., dtype=bool> to a boolean value...
我也试过sample from a dask bag,但是当k大于包的长度时会报错:
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()
报错
Exception: ValueError('Sample larger than population or is negative')
有什么方法可以得到我想要的结果吗?
在我看来 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
感谢@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()