我有一个如下数据框。
我要进行“循环”和“类型”的分组。分组完成后,我要对前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
答案 0 :(得分:2)
这是使用cumcount
和transform
进行楼层分割的一种方法
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)
这应该接近您想要的。在这里,我仅使用sum
和mean
,随时向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