计算最低 n 个百分位数的平均值

Calculate the average of the lowest n percentile

我有以下数据集。我想找到较低的 20 个百分位数的平均值 运行。例如: 如果我将 运行s 列分成 5 个批次,那么前两行将位于第 20 个百分位。所以这两行的平均值 运行 将是 (1+2)/2 = 1.5 如何将数据框分成 5 个批次(排序),然后找到该特定组的平均值?

我已尝试使用以下内容,但输出显示 2.8 而不是 3

d.runs.quantile(0.2)

输入:


ODI_runs = {'name': ['Tendulkar', 'Sangakkara', 'Ponting', 
                      'Jayasurya', 'Jayawardene', 'Kohli', 
                      'Haq', 'Kallis', 'Ganguly', 'Dravid'], 
            'runs': [1,2,3,4,5,6,7,8,9,10]} 
d = pd.DataFrame(ODI_runs)  

name            runs
Tendulkar       1
Sangakkara      2
Ponting         3
Jayasurya       4
Jayawardene     5
Kohli           6
Haq             7
Kallis          8
Ganguly         9
Dravid          10

输出:

1.5

尝试:

>>> df['runs'].sort_values().head(round(0.2*len(df))).mean()
1.5

如果要获取所有结果,请使用pd.cut:

labels = ['1st', '2nd', '3rd', '4th', '5th']
out = df['runs'].groupby(pd.cut(df['runs'], bins=5, labels=labels)).mean()
print(out)

# Output
runs
1st    1.5
2nd    3.5
3rd    5.5
4th    7.5
5th    9.5
Name: runs, dtype: float64

您可以使用 pandas.DataFrame.quantile 方法:检索分隔我们使用的数据的前 20% 的值 df["runs"].quantile(0.2)。那么,就是全部 pandas:使用 loc 定位正确的行和列,并计算这些值的 .mean()

>> df.loc[df["runs"] <= df["runs"].quantile(0.2), "runs"].mean()
1.5