基于聚合函数结果过滤DataFrame报错:UndefinedVariableError求助
解决GroupBy聚合后Query引用聚合结果的错误问题
问题场景
现有如下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 ...
尝试通过GroupBy聚合后用query过滤聚合结果,代码如下:
my_aggs = {'id': 'count', 'value': [min, max, 'mean'] } df.groupby(['id', 'date']).agg(my_aggs).query('count > 1')
运行后报错:UndefinedVariableError: name 'count' is not defined。
问题原因
使用字典指定多字段聚合时,pandas会生成多级列(MultiIndex):第一级是原DataFrame的列名(id、value),第二级是聚合函数名(count、min、max、mean)。直接写count无法定位到具体列,必须明确指定它所属的上层列。
解决方案
方案1:直接在Query中引用多级列
通过上层列名["聚合函数名"]的格式在query中指定列:
my_aggs = {'id': 'count', 'value': [min, max, 'mean'] } agg_df = df.groupby(['id', 'date']).agg(my_aggs) filtered_df = agg_df.query('id["count"] > 1')
方案2:重命名多级列为单级列
将聚合后的多级列合并为单级列,简化后续过滤操作:
my_aggs = {'id': 'count', 'value': [min, max, 'mean'] } agg_df = df.groupby(['id', 'date']).agg(my_aggs) # 用下划线连接多级列名,生成单级列 agg_df.columns = ['_'.join(col) for col in agg_df.columns] # 直接用合并后的列名过滤 filtered_df = agg_df.query('id_count > 1')
方案3:聚合时直接指定列别名
在聚合字典中为每个聚合结果指定别名,避免生成多级列:
my_aggs = { 'id': ('id_count', 'count'), 'value': [('value_min', min), ('value_max', max), ('value_mean', 'mean')] } agg_df = df.groupby(['id', 'date']).agg(my_aggs) # 直接用指定的别名过滤 filtered_df = agg_df.query('id_count > 1')
内容的提问来源于stack exchange,提问作者Luis
相关产品推荐
相关产品推荐

