【问题标题】: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()

标签: python pandas filter group-by 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

【讨论】:

    猜你喜欢
    • 2019-09-20
    • 2021-04-04
    • 2015-09-11
    • 2023-01-12
    • 2019-04-16
    • 2022-08-16
    • 2016-03-03
    • 2018-02-01
    相关资源
    最近更新 更多