我正在使用类似于下面的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 :('学生',你在指数学校'')
答案 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)