如何将Pandas分组中含特定值的行排序至每组末尾?
解决DataFrame分组内将指定值行移到组末尾的问题
你可以通过添加辅助标记列+分组排序的方式实现需求,具体步骤如下:
步骤说明
- 新增一个布尔辅助列,标记
b列等于222的行; - 按分组列
a和辅助列排序,利用布尔值排序特性(False对应0,True对应1)将标记为True的行(即b=222)放到每组最后; - 若需要保留非目标行的原始相对顺序,使用稳定排序算法
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'])存在两处问题:
eq是方法,需用括号调用:df1['b'].eq(222)而非eq[222];- pandas中没有
sort(position='last')的用法,需通过排序键实现目标逻辑。
内容的提问来源于stack exchange,提问作者mxplk
相关产品推荐
相关产品推荐

