熊猫:分组,过滤行,获取平均值
Posted
技术标签:
【中文标题】熊猫:分组,过滤行,获取平均值【英文标题】:Pandas: Group by, filter rows, get the mean 【发布时间】:2018-12-21 22:07:58 【问题描述】:在 python 中,我有一个熊猫数据框df
,如下所示:
ID Geo Speed
123 False 40
123 True 90
123 True 80
123 False 50
123 True 10
456 False 10
456 True 90
456 False 40
456 True 80
我想将df
按ID
分组,并过滤掉Geo == False
所在的行,并得到Speed
在组中的平均值。所以结果应该是这样的。
ID Mean
123 60
456 85
我的尝试:
df.groupby('ID')["Geo" == False].Speed.mean()
df.groupby('ID').filter(lambda g: g.Geo == False)
df[df.Geo.groupby(df.ID) == False]
他们都没有工作。 有什么解决办法吗?谢谢!
【问题讨论】:
df[df["Geo"] == False].groupby('ID')['Speed'].mean()
【参考方案1】:
使用~
将False
s 反转为True
s 以通过False
s 过滤boolean indexing
:
print (df[~df["Geo"]])
ID Geo Speed
0 123 False 40
3 123 False 50
5 456 False 10
7 456 False 40
df = df[~df["Geo"]].groupby('ID', as_index=False).Speed.mean()
print (df)
ID Speed
0 123 45
1 456 25
对于通过True
s 进行过滤:
print (df[df["Geo"]])
ID Geo Speed
1 123 True 90
2 123 True 80
4 123 True 10
6 456 True 90
8 456 True 80
df = df[df["Geo"]].groupby('ID', as_index=False).Speed.mean()
print (df)
ID Speed
0 123 60
1 456 85
【讨论】:
@GabrielMacotti - 最好只有在可能的情况下使用True
和 False
s 等其他值,如果布尔值更好,则使用 ~
【参考方案2】:
通过使用pivot_table
,现在你得到了真假均值
df.pivot_table('Speed','ID','Geo',aggfunc='mean')
Out[154]:
Geo False True
ID
123 45 60
456 25 85
【讨论】:
以上是关于熊猫:分组,过滤行,获取平均值的主要内容,如果未能解决你的问题,请参考以下文章