Python 熊猫:计算亚组内的百分位数?

Python 熊猫:计算亚组内的百分位数?,python,pandas,Python,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 school_id

我有一个熊猫数据框,看起来像这样:

 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
 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
生成如下,以帮助善意的回答者:

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]
})
我想添加一个百分比列,它表示每个学校的
分数的百分比。因此,该数据集如下所示:

 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
 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\u id
进行分组,然后在每个子组中以某种方式执行
df.quantile()
,然后取消分组


更新:也许我需要从以下内容开始
df.groupby('school_id')['points'].rank(升序=False)
然后将排名除以每个组的长度,使其在0到100之间正常化?

在计算按
“school_id”
分组的子组之间的数字数据排名时,您可以指定
pct=True
,作为方法:

要检查(例如):


您希望在这里做几件事

  • 你希望你的排名是密集的
  • 您希望最低值为零,最高值为100。我称之为包容性排名
我创建了一个单独的函数来应用

def dense_inclusive_pct(x):
    # I subtract one to handle the inclusive bit
    r = x.rank(method='dense') - 1
    return r / r.max() * 100

df.assign(pct=df.groupby('school_id').points.apply(dense_inclusive_pct).astype(int))

   points  school_id  uni_id  pct
0     180        123      44  100
1     160        123      45   50
2     160        123      45   50
3     110        123      48    0
4     180        124      44  100
5     160        124      45   66
6     130        124      47   33
7     120        124      48    0

看看@piRSquared的答案,他似乎已经正确地理解了你的想法,并提出了一个与你期望的o/p相匹配的解决方案。如果这真的是你想要做的,那么你应该接受他的回答,也可能会投上一票。但下一次要非常具体(包括粗略的计算),因为你在这里提出的问题可以用很多方式来解释。