如何按范围分组数据?

时间:2017-01-31 11:08:54

标签: python pandas

我有以下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更加连续,这意味着,而不是确切的值,例如181920等,我想放置范围,例如18-2021-23等等,直到40左右。

数据应按GROUP分组,然后AVG_PERCENT_NEGATIVEAVG_TOTAL_WAIT_TIMEAVG_TOTAL_SERVICE_TIME应针对每个相应的范围进行平均。

重要提示:我们选择范围18-20。群组AAA的相应条目AVG_PERCENT_EVAL_1等于19,而群组BBBBB有两个条目属于此范围 - 18和{{1} }。 19AVG_PERCENT_NEGATIVEAVG_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_118的信息,因此我只想获取{{1}的值} 没有2019的{​​{1}}值进行平均。

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')

enter image description here