计算pandas数据帧的第80个百分位数的函数

时间:2016-05-17 19:23:52

标签: python function pandas

我正在使用类似于下面的pandas DataFrame。

   School  students
0   A       44
1   B       38
2   C       33
3   D       29
4   E       28
5   F       25
6   G       23

我创建了一个功能,旨在遍历每一行并累积整个学校的学生数量,直到总和大于或等于所有学生的75%。然后该函数应返回数据帧的索引。 (该列已经排序。)下面的代码不起作用。你能告诉我出了什么问题吗?错误消息在它下面。

percentile = .75

def get_top(df,perc=percentile):
    thresh = perc*df['students'].sum()
    cum = 0
    for index, row in df.iterrows() :
        cum = cum + row['students']
        if cum >= thresh:
            return index-1
            break

output = df.apply(get_top)

KeyError :('学生',你在指数学校'')

2 个答案:

答案 0 :(得分:1)

您可以numpy.where使用cumsum

print (0.75*df['students'].sum())
165.0

print (df.students.cumsum())
0     44
1     82
2    115
3    144
4    172
5    197
6    220
Name: students, dtype: int64

df['out'] = np.where(df.students.cumsum() >= 0.75*df['students'].sum(), 
                    df.index, 
                    df.students.cumsum())
print (df)
  School  students  out
0      A        44   44
1      B        38   82
2      C        33  115
3      D        29  144
4      E        28    4
5      F        25    5
6      G        23    6

或者,如果您想使用percentile - 函数quantile

print (df.students.quantile(.75))
35.5

df['out'] = np.where(df.students >= df.students.quantile(.75), 
                    df.students.cumsum(), 
                    df.index)
print (df)
  School  students  out
0      A        44   44
1      B        38   82
2      C        33    2
3      D        29    3
4      E        28    4
5      F        25    5
6      G        23    6

答案 1 :(得分:0)

正如Jarad在评论部分中指出的那样,我需要将函数调用更改为:

output = get_top(df,perc=percentile)