选择熊猫中一组对象的33%的开始,中间和结尾部分

时间:2019-07-16 01:44:11

标签: pandas pandas-groupby

我有一个如下数据框。 我要进行“循环”和“类型”的分组。分组完成后,我要对前33%,中33%和末33%执行几个操作(sum,mean,var,std,rolling mean,lingress ......)。我该怎么做? 使用head()tail()时,我只能选择前几行和后几​​行(如果我知道我需要的行数,并且由于每个组的长度不同,我也不知道这些值)。那么,有人可以指导吗?

Cycle	Type	Time	Values
2	2	101	20.402
2	2	102	20.402
2	2	103	20.402
2	2	104	20.402
2	2	105	20.402
2	2	106	20.383
2	2	107	20.383
2	2	108	20.383
2	2	109	20.383
2	2	110	20.383
2	2	111	20.36
2	2	112	20.36
2	2	113	20.36
2	2	114	20.36
2	2	115	20.36
2	2	116	20.36
2	2	117	20.36
2	2	118	20.36
2	2	119	20.36
2	2	120	20.36
2	2	121	20.348
2	2	122	20.348
2	2	123	20.348
2	2	124	20.348
2	2	125	20.348
3	1	126	20.34
3	1	127	20.34
3	1	128	20.34
3	1	129	20.34
3	1	130	20.34
3	1	131	20.337
3	1	132	20.337
3	1	133	20.337
3	1	134	20.337
3	1	135	20.337
3	1	136	20.342
3	1	137	20.342
3	1	138	20.342
3	1	139	20.342
3	1	140	20.342
3	1	141	20.342
3	1	142	20.342
3	1	143	20.342
3	1	144	20.342
3	1	145	20.342
3	1	146	20.335
3	1	147	20.335
3	1	148	20.335
3	1	149	20.335
5	2	102	20.402
5	2	103	20.402
5	2	104	20.402
5	2	105	20.402
5	2	106	20.383
5	2	107	20.383
5	2	108	20.383
5	2	109	20.383
5	2	110	20.383
5	2	111	20.36
5	2	112	20.36
5	2	113	20.36
5	2	114	20.36
5	2	115	20.36
5	2	116	20.36
5	2	117	20.36
5	2	118	20.36
5	2	119	20.36
根据Valenteno的建议更新 enter image description here

2 个答案:

答案 0 :(得分:2)

这是使用cumcounttransform进行楼层分割的一种方法

g=df.groupby(['Cycle','Time'])
s=g.cumcount()//(g.Cycle.transform('count')//3).clip(upper=2)
df.groupby([df.Cycle,df.Time,s]).apply(Yourfunctionhere)

答案 1 :(得分:0)

这应该接近您想要的。在这里,我仅使用summean,随时向agg参数列表添加其他功能。

def sample(x):
    aggrfunc = ['sum', 'mean']
    first = x.iloc[0:len(x)//3].agg(aggrfunc)
    middle = x.iloc[len(x)//3:2*len(x)//3].agg(aggrfunc)
    last = x.iloc[2*len(x)//3:].agg(aggrfunc)
    return pd.concat([first, middle, last], keys=['top 33%', 'middle 33%', 'bottom 33%']))

ddf = df.groupby(['Cycle', 'Type']).apply(sample)

使用示例数据框,此代码将产生ddf

                            Cycle  Type    Time      Values
Cycle Type                                                 
2     2    top 33%    sum    16.0  16.0   836.0  163.159000
                      mean    2.0   2.0   104.5   20.394875
           middle 33% sum    16.0  16.0   900.0  162.926000
                      mean    2.0   2.0   112.5   20.365750
           bottom 33% sum    18.0  18.0  1089.0  183.180000
                      mean    2.0   2.0   121.0   20.353333
3     1    top 33%    sum    24.0   8.0  1036.0  162.711000
                      mean    3.0   1.0   129.5   20.338875
           middle 33% sum    24.0   8.0  1100.0  162.726000
                      mean    3.0   1.0   137.5   20.340750
           bottom 33% sum    24.0   8.0  1164.0  162.708000
                      mean    3.0   1.0   145.5   20.338500
5     2    top 33%    sum    30.0  12.0   627.0  122.374000
                      mean    5.0   2.0   104.5   20.395667
           middle 33% sum    30.0  12.0   663.0  122.229000
                      mean    5.0   2.0   110.5   20.371500
           bottom 33% sum    30.0  12.0   699.0  122.160000
                      mean    5.0   2.0   116.5   20.360000