导入 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