Pandas按索引列过滤groupby分组后数据集问题咨询
问题解决
首先明确两个核心错误点:
- 你执行
data.groupby(["Year", "Month", "Day"]).sum()后得到的grouped是聚合完成的普通DataFrame,不是GroupBy对象,此时调用的filter是DataFrame的列过滤方法,完全不符合你的行筛选需求。 - 你当前的索引是三层MultiIndex(多层索引),每一层都对应
Year、Month、Day的名称,不是无名称的元组索引,可以直接按索引层筛选。
解决方案
筛选2017年8月的所有记录
有两种常用写法:
- 用
loc直接匹配多层索引(最简洁):
# 元组(2017,8)匹配前两层索引=2017年、8月,冒号表示保留所有列 aug_2017_data = grouped.loc[(2017, 8), :]
- 用索引层值判断(扩展性更强,适合复杂条件):
aug_2017_data = grouped[ (grouped.index.get_level_values('Year') == 2017) & (grouped.index.get_level_values('Month') == 8) ]
筛选Baana列值大于300的记录
直接用布尔索引即可,不需要调用filter方法:
baana_over_300 = grouped[grouped['Baana'] > 300]
原有代码错误原因
你之前写的grouped.filter(lambda x: x > (2014, 1, 1) for x in grouped.index)属于语法错误,将生成器表达式传入了DataFrame的filter方法,该方法本身只用于筛选列,不处理行筛选逻辑,因此返回空结果。
GroupBy对象的filter方法是用于分组级别的过滤(比如只保留分组求和结果满足特定条件的整个分组),你已经完成了聚合操作,不需要再使用该方法。
内容的提问来源于stack exchange,提问作者Nicola
相关产品推荐
相关产品推荐

