You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

关键步骤说明

  1. 标记分组大小:用transform方法给每条数据打上对应分组的总条数标签,方便后续过滤和排序
  2. 过滤小分组:直接筛选分组大小≥3的行,剔除不符合要求的分组数据
  3. 排序控制:先按分组大小降序排列(大分组优先),再按原索引升序保证组内数据顺序和原始数据一致;groupby时设置sort=False,避免Pandas默认按分组键排序
  4. 输出分组:遍历处理后的分组并打印,即可得到符合要求的结果

内容的提问来源于stack exchange,提问作者beetlej

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 08:50:54