基于groupby信息使用transform过滤DataFrame的问题
问题原因及解决办法
你的代码没生效的核心原因是:groupby(['id']).transform('size')返回的是和原DataFrame同结构的DataFrame(列名仍为id),而原数据包含id和info两列。用这个布尔DataFrame去索引原数据时,Pandas会按列名匹配,导致只有id列参与过滤,最终结果不符合预期。
举个实际的例子:运行data.groupby(['id']).transform('size')会得到一个仅含id列的DataFrame,每个值对应对应id的出现次数。当你用==3生成布尔DataFrame后,原DataFrame的info列没有对应的布尔值匹配,索引逻辑自然出错。
正确写法有两种:
- 针对
id列单独做transform,得到Series来索引:
data[data.groupby(['id'])['id'].transform('size') == 3]
或者更简洁的写法:
data[data['id'].groupby(data['id']).transform('size') == 3]
- 用
groupby的filter方法,逻辑更直观:
data.groupby('id').filter(lambda x: len(x) == 3)
这两种写法都能正确筛选出所有出现次数为3次的id对应的行,最终结果会保留id为0、1、3的全部数据。
内容的提问来源于stack exchange,提问作者Henri
相关产品推荐
相关产品推荐

