Я новичок в Pandas и хочу преобразовать следующий простой код R в Pandas для вычисления как среднего, так и средневзвешенного значения столбца (на практике агрегируется гораздо больше столбцов). Решение должно быть цепным, так как есть несколько шагов как до, так и после этого расчета. Я посмотрел на решения с использованием функции apply ( Рассчитать средневзвешенное значение, используя pandas / dataframe ), но затем кажется, что нужно либо выполнить полный шаг агрегации (на всех, возможно, не связанных, столбцах) внутривнутри функции apply, которую я нахожу некрасивой, или вычисляю среднее и средневзвешенное значение отдельно, а затем выполняю объединение таблиц. Каков современный способ сделать это в Пандах?
df = data.frame(batch=c("A", "A", "B", "B", "C","C"), value=1:6, weight=1:6)
df %>%
group_by(batch) %>%
summarise(avg = mean(value), avg_weighted = sum(value*weight)/sum(weight))
# A tibble: 3 x 3
batch avg avg_weighted
<chr> <dbl> <dbl>
1 A 1.5 1.67
2 B 3.5 3.57
3 C 5.5 5.55
И вот моя попытка Панд:
df2 = pd.DataFrame({'batch': ["A", "A", "B", "B", "C", "C"], 'value':[1,2,3,4,5,6], 'weight':[1,2,3,4,5,6]})
def agg_step(grp):
return pd.DataFrame({'avg':[grp['value'].mean()],
'avg_weighted':np.average(grp['value'], weights=grp['weight'])})
(df2.
groupby('batch')
.apply(agg_step)
.reset_index()
.drop(columns='level_1')
)
Out[93]:
batch avg avg_weighted
0 A 1.5 1.666667
1 B 3.5 3.571429
2 C 5.5 5.545455