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
elsemax
,则可以使用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')