Я экспериментирую с Dask, но у меня возникла проблема при использовании apply
после группировки.
У меня есть Dask DataFrame с большим количеством строк. Давайте рассмотрим, например, следующее
N=10000
df = pd.DataFrame({'col_1':np.random.random(N), 'col_2': np.random.random(N) })
ddf = dd.from_pandas(df, npartitions=8)
Я хочу добавить значения col_1
, и я следую решению от здесь
bins = np.linspace(0,1,11)
labels = list(range(len(bins)-1))
ddf2 = ddf.map_partitions(test_f, 'col_1',bins,labels)
, где
def test_f(df,col,bins,labels):
return df.assign(bin_num = pd.cut(df[col],bins,labels=labels))
и это работает так, как я ожидаю.
Теперь я хочу взять значение медианы в каждом бине (взято из здесь )
median = ddf2.groupby('bin_num')['col_1'].apply(pd.Series.median).compute()
Имея 10 ячеек, я ожидаю, что median
будет иметь 10 строк, но на самом деле их 80. В кадре данных есть 8 разделов, поэтому я предполагаю, что приложение как-то работает с каждым из них по отдельности.
Однако, Если я хочу получить среднее значение и использовать mean
median = ddf2.groupby('bin_num')['col_1'].mean().compute()
, оно работает, и на выходе есть 10 строк.
Тогда возникает вопрос: что я делаю неправильно, что предотвращает apply
работает как mean
?