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相匹配的解决方案。如果这真的是你想要做的,那么你应该接受他的回答,也可能会投上一票。但下一次要非常具体(包括粗略的计算),因为你在这里提出的问题可以用很多方式来解释。