如何在Pandas GroupBy后移除空列表条目(类SQL HAVING子句)
解决Pandas Groupby后移除空列表的最优方案
你之前的filter用法错误原因
filter方法的作用是筛选原DataFrame中符合条件的行,返回的是Series/DataFrame而非分组后的聚合对象。所以你直接在filter后调用apply(list),会把每个单独的SALE PRICE数值当成迭代对象,自然触发TypeError: 'int' object is not iterable。
两种更优实现方案
方案一:先过滤分组,再生成列表
先通过groupby的filter排除掉空分组,再重新分组生成列表,从源头避免空列表出现:
for name in clean.alpha_names: # 筛选出分组后元素数量大于0的行(若要排除单元素分组,改成len(x) > 1) filtered_series = df_new_housing.groupby(name)['SALE PRICE'].filter(lambda x: len(x) > 0) # 基于过滤后的结果重新分组生成列表 CategoryGroupLists = filtered_series.groupby(name).apply(list)
方案二:先生成分组列表,再用布尔索引过滤
先完成分组聚合,再直接通过布尔索引筛选掉空列表条目,代码更简洁高效:
for name in clean.alpha_names: CategoryGroupLists = df_new_housing.groupby(name)['SALE PRICE'].apply(list) # 直接筛选出长度大于0的列表(同理,要排除单元素则改成>1) CategoryGroupLists = CategoryGroupLists[CategoryGroupLists.str.len() > 0]
方案优势
这两种方法都比你之前的遍历删除高效:
- 避免了手动遍历索引和删除操作,代码更简洁易维护
- 布尔索引和groupby过滤都是Pandas内置的向量化操作,处理大数据量时性能远高于循环遍历
内容的提问来源于stack exchange,提问作者arame3333
相关产品推荐
相关产品推荐

