pandas 按聚合函数的结果进行筛选

nhjlsmyf  于 2023-03-21  发布在  其他
关注(0)|答案(3)|浏览(130)

这是我的 Dataframe :

date    id      value
0   2002-01-07  PA12165 119.63
1   2002-03-13  PA12165 119.48
2   2002-05-13  PA12165 114.50
3   2002-06-12  PA12165 120.27
4   2002-06-12  PA12165 120.27
...

我想通过一个聚合函数的结果过滤得到另一个 Dataframe 。这是我的尝试:

my_aggs = {'id': 'count',
           'value': [min, max, 'mean']
          }
df.groupby(['id', 'date']).agg(my_aggs).query('count > 1')

升高:UndefinedVariableError: name 'count' is not defined
如您所见,我无法在查询中找到引用聚合函数的方法

83qze16e

83qze16e1#

您有一个MultiIndexcount列不存在,但(id, count)是:

# Output before query

#        MultiIndex --v
                      id   value                
                   count     min     max    mean
id      date                                    
PA12165 2002-01-07     1  119.63  119.63  119.63
        2002-03-13     1  119.48  119.48  119.48
        2002-05-13     1  114.50  114.50  114.50
        2002-06-12     2  120.27  120.27  120.27

要避免使用MultiIndexquery带来的麻烦,您可以用途:

my_aggs = {'count': ('id', 'count'),
           'min': ('value', 'min'),
           'max': ('value', 'max'),
           'mean': ('value', 'mean')}

out = df.groupby(['id', 'date'], as_index=False).agg(**my_aggs).query('count > 1')

输出:

>>> out
        id        date  count     min     max    mean
3  PA12165  2002-06-12      2  120.27  120.27  120.27
6rqinv9w

6rqinv9w2#

您有一个MultiIndex,因此需要对两个级别进行切片。使用loc

my_aggs = {'id': 'count',
           'value': [min, max, 'mean']
          }

(df.groupby(['id', 'date']).agg(my_aggs)
   .loc[lambda d: d[('id', 'count')] > 1]
 )

输出:

id   value                
                   count     min     max    mean
id      date                                    
PA12165 2002-06-12     2  120.27  120.27  120.27
balp4ylt

balp4ylt3#

df_agg = df.groupby(['id', 'date']).agg(my_aggs)
df2 = df_agg[df_agg[('id', 'count')] > 1]

相关问题