按百分位数汇总并计算 python 中的组

Aggregate by percentile and count for groups in python

我是熟悉 R 的 python 新用户。

我想为每个组计算用户定义的分位数,并完成每个组中的观察计数。

在 R 中我会这样做:

df_sum <- df %>% group_by(group) %>% 
  dplyr::summarise(q85 = quantile(obsval, probs = 0.85, type = 8),
                   n = n())

在 python 中,我可以通过以下方式获得分组百分位数:

df_sum = df.groupby(['group'])['obsval'].quantile(0.85)

如何向其中添加组计数?

我试过:

df_sum = df.groupby(['group'])['obsval'].describe(percentile=[0.85])[[count]]
df_sum = df.groupby(['group'])['obsval'].quantile(0.85).describe(['count'])

示例数据:

data = {'group':['A', 'B', 'A', 'A', 'B', 'B', 'B', 'A', 'A'], 'obsval':[1, 3, 3, 5, 4, 6, 7, 7, 8]}
df = pd.DataFrame(data)
df

预期结果:

group  percentile count
A       7.4        5
B       6.55       4

您可以使用pandas.DataFrame.agg()来应用多个函数。
在这种情况下,您应该使用 numpy.quantile().

import pandas as pd
import numpy as np

data = {'group':['A', 'B', 'A', 'A', 'B', 'B', 'B', 'A', 'A'], 'obsval':[1, 3, 3, 5, 4, 6, 7, 7, 8]}
df = pd.DataFrame(data)
df_sum = df.groupby(['group'])['obsval'].agg([lambda x : np.quantile(x, q=0.85), "count"])
df_sum.columns = ['percentile', 'count']
print(df_sum)