Расчет средневзвешенной цепочки в Пандах - PullRequest
1 голос
/ 21 октября 2019

Я новичок в 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

1 Ответ

0 голосов
/ 21 октября 2019

Это должно работать:

(df2.groupby("batch")
    .agg({
        "value": [
            "mean", 
            lambda x: np.average(x, weights=df2.loc[x.index, "weight"])
         ]
     }))

на основе https://stackoverflow.com/a/31521177/1011724

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...