我有以下pandas数据帧(它只是一个小提取):
GROUP AVG_PERCENT_EVAL_1 AVG_PERCENT_NEGATIVE AVG_TOTAL_WAIT_TIME AVG_TOTAL_SERVICE_TIME
AAAAA 19 11.000000 25.000000 163.000000
AAAAA 22 2.000000 146.364198 332.761317
AAAAA 23 0.500000 44.068225 302.708639
AAAAA 24 1.000000 122.672215 322.359795
AAAAA 26 1.000000 143.594896 317.940989
BBBBB 18 1.000000 121.225692 319.292226
BBBBB 19 1.000000 40.054707 201.096152
BBBBB 21 0.333333 29.221458 207.142059
BBBBB 27 2.000000 103.796290 313.685358
我需要让AVG_PERCENT_EVAL_1
更加连续,这意味着,而不是确切的值,例如18
,19
,20
等,我想放置范围,例如18-20
,21-23
等等,直到40左右。
数据应按GROUP
分组,然后AVG_PERCENT_NEGATIVE
,AVG_TOTAL_WAIT_TIME
和AVG_TOTAL_SERVICE_TIME
应针对每个相应的范围进行平均。
重要提示:我们选择范围18-20
。群组AAA
的相应条目AVG_PERCENT_EVAL_1
等于19
,而群组BBBBB
有两个条目属于此范围 - 18
和{{1} }。 19
,AVG_PERCENT_NEGATIVE
和AVG_TOTAL_WAIT_TIME
的值应为以下值:
AVG_TOTAL_SERVICE_TIME
我知道如何按具体列对数据进行分组,然后计算“意味着'或者'计算'使用GROUP AVG_PERCENT_RANGE AVG_PERCENT_NEGATIVE AVG_TOTAL_WAIT_TIME AVG_TOTAL_SERVICE_TIME
AAAAA 18-20 11.00 25.00 163.000000
BBBBB 18-20 1.00 80.64 260,19
。但是,在这种情况下,我不知道如何为agg
创建范围。此外,我不知道如何定义缺少条目不应被视为AVG_PERCENT_EVAL_1
。例如,在上面的示例中,没有关于0
AAAAA
等于AVG_PERCENT_EVAL_1
和18
的信息,因此我只想获取{{1}的值} 没有对20
和19
的{{1}}值进行平均。
答案 0 :(得分:1)
<强>步骤:强>
1)通过指定bin
序列,使用pd.cut()
将 AVG_PERCENT_EVAL_1 绑定到适当的标签中。
指定include_lowest=True
会考虑左端点"["
的包容性,而right=False
会使右端点成为开放时间间隔")"
。
2)使用返回的类别,根据需要重新标记它们。
3)Peform groupby
将 GROUP 和新计算的分箱范围作为分组键,从中删除 AVG_PERCENT_EVAL_1 后聚合所有当前列的均值
分箱部分:
step=3
kwargs = dict(include_lowest=True, right=False)
bins = pd.cut(df.AVG_PERCENT_EVAL_1, bins=np.arange(18,40+step,step), **kwargs)
labels = [(str(int(cat[1:3])) + "-" + str(int(cat[5:7])-1)) for cat in bins.cat.categories]
bins.cat.categories = labels
分配和groupby.agg()
:
df = df.assign(AVG_PERCENT_RANGE=bins).drop("AVG_PERCENT_EVAL_1", axis=1)
df.groupby(['GROUP', 'AVG_PERCENT_RANGE'], as_index=False).agg('mean')