Python 按函数分组

Python 按函数分组,python,pandas,group-by,max,min,Python,Pandas,Group By,Max,Min,我有这张桌子 uname sid usage 0 Ahmad a 5 1 Ahmad a 7 2 Ahmad a 10 3 Ahmad b 2 4 Mohamad c 6 5 Mohamad c 7 6 Mohamad c 9 我想按uname和side进行分组,并将usage column=group.max-group.min。但如果组计数为1返回组max 应该把它放出来 uname sid u

我有这张桌子

    uname   sid usage
0   Ahmad   a   5
1   Ahmad   a   7
2   Ahmad   a   10
3   Ahmad   b   2
4   Mohamad c   6
5   Mohamad c   7
6   Mohamad c   9
我想按uname和side进行分组,并将usage column=
group.max
-
group.min
。但如果组计数为
1
返回组
max

应该把它放出来

    uname   sid usage
0   Ahmad   a   5
1   Ahmad   b   2
2   Mohamad c   3    
如果
length
大于
1
else
max
,则可以使用with difference and:

df = df.groupby(['uname','sid'])['usage']
       .apply(lambda x: x.max()-x.min() if len(x) > 1 else x.max())
       .reset_index()
print (df)
     uname sid  usage
0    Ahmad   a      5
1    Ahmad   b      2
2  Mohamad   c      3
我想你也可以使用
iloc
来代替
max

df = df.groupby(['uname','sid'])['usage']
       .apply(lambda x: x.max()-x.min() if len(x) > 1 else x.iloc[0])
       .reset_index()
print (df)
     uname sid  usage
0    Ahmad   a      5
1    Ahmad   b      2
2  Mohamad   c      3
另一种解决方案,具有以下测试:


首先,使用
agg
抓取每组的
min
max
size

然后将
min
乘以
size>1
。如果是,则等于
min
,否则等于
0
。然后从
max
中减去该值

d1 = df.groupby(['uname', 'sid']).usage.agg(['min', 'max', 'size'])
d1['max'].sub(d1['min'].mul(d1['size'].gt(1))).reset_index(name='usage')

最好使用
d1['max'].sub(d1['min'].mul(d1['size'].gt(1))。重置索引(name='usage')
d1 = df.groupby(['uname', 'sid']).usage.agg(['min', 'max', 'size'])
d1['max'].sub(d1['min'].mul(d1['size'].gt(1))).reset_index(name='usage')