Можете ли вы случайным образом выбрать k значений из серии Даска?

Я хочу случайным образом выбирать значения k без замены из серии Dask, и я не хочу заранее вычислять длину серии. Если 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› в логическое значение ...

Я также пробовал образец из сумки для белья., но выдает ошибку, если 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()

дает ошибку

Исключение: ValueError ('Выборка больше генеральной совокупности или отрицательная')

Есть ли способ получить желаемый результат?


person victoria55    schedule 30.07.2020    source источник
comment
К вашему сведению: тщательный ответ на вопросы требует времени. Если ваш вопрос решен, поблагодарите вас, приняв решение, которое лучше всего соответствует вашим потребностям. Флажок принять находится под стрелкой вверх / вниз в левом верхнем углу ответа. Новое решение может быть принято, если появится лучшее. Вы также можете проголосовать за качество / полезность ответа, используя стрелку вверх или вниз. Оставьте комментарий, если решение не отвечает на вопрос. Что мне делать, когда кто-то ответит на мой вопрос?. Спасибо   -  person rpanai    schedule 12.08.2020


Ответы (2)


Мне кажется, что 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
person rpanai    schedule 02.08.2020
comment
Спасибо @rpanai за ответ. Однако я хочу выбрать фиксированное количество строк из произвольной серии Dask (любой длины) без вычисления длины серии перед выборкой. Таким образом, параметр frac для .sample() зависит от df.shape (или длины данных), которые я не хочу вычислять перед вызовом .sample(). - person victoria55; 02.08.2020
comment
Что, если вы возьмете фиксированное количество строк из каждого раздела? В этом случае вы можете использовать map_partition - person rpanai; 02.08.2020

Благодаря предложению @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()
person victoria55    schedule 03.08.2020