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
相关产品推荐
相关产品推荐

