如何在Pandas中按分组内最小值排序并生成组索引?
实现方法
可以用Pandas的组合操作高效完成需求,步骤清晰且性能最优:
- 计算分组最小值:先通过
groupby获取每个Col分组对应的Val最小值,生成关联映射 - 按分组最小值排序:将原DataFrame与分组最小值关联,以此为键对整个DataFrame排序
- 生成分组索引:对排序后的
Col列做因子化,得到连续的分组索引Idx
具体代码
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Col': ['a.', 'a.', 'c.', 'c.', 'd.', 'd.'], 'Val': [8, 9, 4, 0, 3, 9] }) # 步骤1:计算每个Col的Val最小值 group_min = df.groupby('Col')['Val'].min() # 步骤2:关联最小值并按其排序 df_sorted = df.merge(group_min.rename('Val_min'), on='Col').sort_values('Val_min') # 步骤3:生成分组索引Idx df_sorted['Idx'] = pd.factorize(df_sorted['Col'])[0] # 移除临时列Val_min,得到最终结果 df_new = df_sorted.drop('Val_min', axis=1)[['Col', 'Val', 'Idx']] print(df_new)
代码解释
groupby('Col')['Val'].min():快速计算每个分组的最小值,返回以Col为索引的Seriesmerge(..., on='Col'):将每行对应的分组最小值关联到原数据,方便后续排序sort_values('Val_min'):按分组最小值对整个DataFrame排序,保证分组顺序符合要求pd.factorize(df_sorted['Col'])[0]:对排序后的分组列进行因子化,自动生成从0开始的连续索引,同一个分组对应同一个Idx值
更简洁的链式写法
如果喜欢紧凑代码,可以合并为链式调用:
df_new = (df .merge(df.groupby('Col')['Val'].min().rename('Val_min'), on='Col') .sort_values('Val_min') .assign(Idx=lambda x: pd.factorize(x['Col'])[0]) .drop('Val_min', axis=1) [['Col', 'Val', 'Idx']])
这种方法利用Pandas向量化操作,避免循环,大数据量下性能优异,是最优实现方式之一。
内容的提问来源于stack exchange,提问作者Cranjis
相关产品推荐
相关产品推荐

