Python Pandas 按功能分组
Posted
技术标签:
【中文标题】Python Pandas 按功能分组【英文标题】:Python Pandas group by function 【发布时间】:2017-01-15 05:29:25 【问题描述】:我有这张桌子
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
我想按 unname 和 side 进行分组,并且使用列 = group.max
- group.min
。但是如果组数是1
,则返回组max
输出应该是
uname sid usage
0 Ahmad a 5
1 Ahmad b 2
2 Mohamad c 3
【问题讨论】:
【参考方案1】:首先,使用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))).reset_index(name='usage')
【参考方案2】:
您可以使用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
【讨论】:
以上是关于Python Pandas 按功能分组的主要内容,如果未能解决你的问题,请参考以下文章
行中的 Python/Pandas 数据帧时间数据(按名称分组)
Python Pandas:按日期分组,并按时间戳访问每个组