2016-09-07 142 views
2

組我有這樣的表Python的熊貓由函數

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和側要組,並且具有使用列= group.max - group.min。但是,如果組數爲1返回組max

了出來放應

uname sid usage 
0 Ahmad a 5 
1 Ahmad b 2 
2 Mohamad c 3  

回答

1

首先,使用aggminmax,和各組的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') 

enter image description here

+1

也許更好是使用'D1 [ '最大'。子(D1 [ '分']。MUL(D1 [ '尺寸']。GT(1)))。reset_index( name ='usage')' – jezrael

+0

@jezrael tyvm .. – piRSquared

1

您可以使用groupbyapply差異maxmin如果length是多爲1其他max

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 

我認爲,而不是max你也可以使用iloc

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 

Series.where另一種解決方案,其中測試size

g = df.groupby(['uname','sid'])['usage'] 
s = g.max()-g.min() 
print (s) 
uname sid 
Ahmad a  5 
     b  0 
Mohamad c  3 
Name: usage, dtype: int64 

print (g.size() == 1) 
uname sid 
Ahmad a  False 
     b  True 
Mohamad c  False 
dtype: bool 

print (s.where(g.size() != 1, g.max()).reset_index()) 
    uname sid usage 
0 Ahmad a  5 
1 Ahmad b  2 
2 Mohamad c  3