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

Pandas Groupby按行计数百分比提取各分组前指定比例排序数据

实现方案

你可以通过groupby.apply()结合分组长度计算来实现这个需求,具体代码如下:

# 先对全表按score字段降序排序
df_sorted = df.sort_values('score', ascending=False)

# 按state、city分组后,取每个分组内前80%的行
result = df_sorted.groupby(['state', 'city'], group_keys=False).apply(
    lambda group: group.head(int(len(group) * 0.8))
)

说明

  • 如果你的实际字段名是大写的State、City,替换掉groupby参数里的对应字段名即可
  • group_keys=False参数可以避免分组键额外生成索引层级,输出结果的结构和原DataFrame保持一致
  • 这里用int()是向下取整计算要保留的行数,如果你需要四舍五入可以替换成round(len(group)*0.8),需要向上取整可以引入math模块用math.ceil(len(group)*0.8)
  • 如果遇到同分的情况你希望把所有同分的行都保留,而不是严格截断到刚好80%的数量,可以用分位数判断的写法:
result = df_sorted.groupby(['state', 'city'], group_keys=False).apply(
    lambda group: group[group['score'] >= group['score'].quantile(0.2, interpolation='lower')]
)

这种写法的逻辑是取分数大于等于分组内20%分位数的所有行,刚好对应降序排序后的前80%分数区间的所有数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:06:02