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

如何将Pandas分组中含特定值的行排序至每组末尾?

解决DataFrame分组内将指定值行移到组末尾的问题

你可以通过添加辅助标记列+分组排序的方式实现需求,具体步骤如下:

步骤说明

  1. 新增一个布尔辅助列,标记b列等于222的行;
  2. 按分组列a和辅助列排序,利用布尔值排序特性(False对应0,True对应1)将标记为True的行(即b=222)放到每组最后;
  3. 若需要保留非目标行的原始相对顺序,使用稳定排序算法mergesort。

完整代码示例

import pandas as pd

# 示例数据
data = {'a':[1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3],
        'b':[100, 300, 200, 222, 500, 300, 222, 100, 200, 222, 300, 500, 400, 100],
        'c':[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]}
df1 = pd.DataFrame(data)

# 添加辅助列,标记b是否为222
df1['is_222'] = df1['b'].eq(222)

# 按a分组,再按is_222升序排序,保留非目标行原始顺序
df_result = df1.sort_values(by=['a', 'is_222'], kind='mergesort').drop(columns='is_222')

print(df_result)

代码解释

  • df1['b'].eq(222):生成布尔序列,对应b列等于222的行标记为True,其余为False;
  • sort_values(by=['a', 'is_222'], kind='mergesort'):先按a分组,再按辅助列升序排序,确保False(非222行)在前,True(222行)在后;mergesort是稳定排序,能保留同一分组内非目标行的原始相对位置;
  • drop(columns='is_222'):删除辅助列,得到最终结果。

错误代码修正说明

你之前尝试的df1 = df1['b'].eq[222].sort(position='last').groupby(df1['a'])存在两处问题:

  1. eq是方法,需用括号调用:df1['b'].eq(222)而非eq[222];
  2. pandas中没有sort(position='last')的用法,需通过排序键实现目标逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:43:24