熊猫:分组,过滤行,获取平均值

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

我想将dfID 分组,并过滤​​掉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】:

使用~Falses 反转为Trues 以通过Falses 过滤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

对于通过Trues 进行过滤:

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 - 最好只有在可能的情况下使用 TrueFalses 等其他值,如果布尔值更好,则使用 ~【参考方案2】:

通过使用pivot_table,现在你得到了真假均值

df.pivot_table('Speed','ID','Geo',aggfunc='mean')
Out[154]: 
Geo  False  True 
ID               
123     45     60
456     25     85

【讨论】:

以上是关于熊猫:分组,过滤行,获取平均值的主要内容,如果未能解决你的问题,请参考以下文章

格式化按两列分组的熊猫数据系列,并在第三个重新采样,平均值为 dict

按滚动方式分组熊猫

使用熊猫/数据框计算加权平均值

groupby对象熊猫的绝对值的平均值

计算过滤和分组后的平均值

熊猫在数据框列表中获得每(行,列)的平均值