您可以使用groupby
與apply
差異max
和min
如果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
也許更好是使用'D1 [ '最大'。子(D1 [ '分']。MUL(D1 [ '尺寸']。GT(1)))。reset_index( name ='usage')' – jezrael
@jezrael tyvm .. – piRSquared