我有一个看起来像这样的Pandas数据框:

 school_id  uni_id  points
 123        44      180
 123        45      160
 123        45      160
 123        48      110
 124        44      180
 124        45      160
 124        47      130
 123        48      120

生成如下,以帮助善良的回答者:
df = pd.DataFrame({
    'school_id': [123, 123, 123, 123, 124, 124, 124, 124],
    'school_id': [44, 45, 45, 48, 44, 45, 47, 48],
    'points': [180, 160, 160, 110, 180, 160, 130, 120]
})

我想添加一个百分位列,该列代表每所学校的points值的百分位。因此,该数据集将如下所示:
 school_id  uni_id  points  percentile
 123        44      180     100
 123        45      160     50
 123        45      160     50
 123        48      110     0
 124        44      180     100
 124        45      160     66
 124        47      130     33
 123        48      120     0

最好的方法是什么?我假设我需要按school_id进行分组,然后以某种方式在每个子组内进行df.quantile(),然后取消分组?

更新:也许我需要从这样的东西开始... df.groupby('school_id')['points'].rank(ascending=False),然后将等级除以每组的长度以将其标准化为0到100?

最佳答案

您可以在计算pct=True分组的子组之间的数值数据等级时指定"school_id",作为 GroupBy.rank 方法的附加arg:

df.assign(percentile=df.groupby("school_id")['points'].rank(pct=True).mul(100))

python -  Pandas :计算子组内的百分位数?-LMLPHP

要检查(针对一个实例):
from scipy.stats import percentileofscore
df.groupby("school_id")['points'].apply(percentileofscore, 160)

school_id
123    70.000000
124    66.666667
Name: points, dtype: float64

10-04 13:24