如何在Pandas中按分组大小排序并剔除规模小于3的分组
Pandas分组处理:按组大小排序并过滤小分组
需求
- 按分组大小降序排列各组
- 剔除成员数小于3的分组
示例中,分组z有4条数据、y有3条,需按z→y的顺序保留输出;分组x仅2条,直接剔除。
原始示例代码
import pandas as pd data = [ ['x', 1], ['y', 5], ['z', 1], ['x', 43], ['y', 22], ['z', 2], ['y', 31], ['z', 3], ['z', 4], ] df = pd.DataFrame(data, columns=['name', 'value']) print(df) dfg = df.groupby('name') for name, df in dfg: print(name) print(df)
当前输出
name value 0 x 1 1 y 5 2 z 1 3 x 43 4 y 22 5 z 2 6 y 31 7 z 3 8 z 4 x name value 0 x 1 3 x 43 y name value 1 y 5 4 y 22 6 y 31 z name value 2 z 1 5 z 2 7 z 3 8 z 4
期望输出
name value 2 z 1 5 z 2 7 z 3 8 z 4 name value 1 y 5 4 y 22 6 y 31
解决方案代码
import pandas as pd data = [ ['x', 1], ['y', 5], ['z', 1], ['x', 43], ['y', 22], ['z', 2], ['y', 31], ['z', 3], ['z', 4], ] df = pd.DataFrame(data, columns=['name', 'value']) # 给每行添加对应分组的大小 df['group_size'] = df.groupby('name')['name'].transform('count') # 过滤掉分组大小不足3的行 filtered = df[df['group_size'] >= 3] # 先按分组大小降序,再按原索引升序排序(保证组内顺序和原数据一致) sorted_filtered = filtered.sort_values(by=['group_size', df.index], ascending=[False, True]) # 删除临时列 sorted_filtered = sorted_filtered.drop(columns=['group_size']) # 按分组输出,sort=False保持排序后的分组顺序 for _, group in sorted_filtered.groupby('name', sort=False): print(group)
关键步骤说明
- 标记分组大小:用
transform方法给每条数据打上对应分组的总条数标签,方便后续过滤和排序 - 过滤小分组:直接筛选分组大小≥3的行,剔除不符合要求的分组数据
- 排序控制:先按分组大小降序排列(大分组优先),再按原索引升序保证组内数据顺序和原始数据一致;
groupby时设置sort=False,避免Pandas默认按分组键排序 - 输出分组:遍历处理后的分组并打印,即可得到符合要求的结果
内容的提问来源于stack exchange,提问作者beetlej
相关产品推荐
相关产品推荐

