pandas group by + rank 求在分组内的百分位、最接近某百分位的行

2023-01-13 12:46:37 浏览数 (3)

导入 pandas

代码语言:javascript复制
import pandas as pd

创建测试数据

代码语言:javascript复制
df = pd.DataFrame([[2021, 'A', 95],[2021, 'A', 92], [2021, 'A', 50], [2021, 'B', 100], [2021, 'B', 50], [2021, 'B', 30], [2021, 'B', 60]], columns=['year', 'grade', 'value'])
代码语言:javascript复制
>>> df
   year grade  value
0  2021     A     95
1  2021     A     92
2  2021     A     50
3  2021     B    100
4  2021     B     50
5  2021     B     30
6  2021     B     60

分组后,使用 rank

代码语言:javascript复制
df['group_pct'] = df.groupby(['year', 'grade']).rank(ascending=True, pct=True) 

注意:如果除去分组的字段后,还有多列,需要指定列名

代码语言:javascript复制
df['group_pct'] = df.groupby(['year', 'grade'])['col_name'].rank(ascending=True, pct=True) 
代码语言:javascript复制
>>> df 
   year grade  value  group_pct
0  2021     A     95   1.000000
1  2021     A     92   0.666667
2  2021     A     50   0.333333
3  2021     B    100   1.000000
4  2021     B     50   0.500000
5  2021     B     30   0.250000
6  2021     B     60   0.750000

分组内 百分位 最接近 0.25 的行

代码语言:javascript复制
df['group_pct_25'] = (df['group_pct']-0.25).abs()
代码语言:javascript复制
>>> df                                                                      
   year grade  value  group_pct  group_pct_25
0  2021     A     95   1.000000      0.750000
1  2021     A     92   0.666667      0.416667
2  2021     A     50   0.333333      0.083333
3  2021     B    100   1.000000      0.750000
4  2021     B     50   0.500000      0.250000
5  2021     B     30   0.250000      0.000000
6  2021     B     60   0.750000      0.500000
代码语言:javascript复制
t = df.sort_values(['group_pct_25']).groupby(['year', 'grade']).first().reset_index()
代码语言:javascript复制
>>> t
   year grade  value  group_pct  group_pct_25
0  2021     A     50   0.333333      0.083333
1  2021     B     30   0.250000      0.000000

0 人点赞