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

如何在Pandas中按分组内最小值排序并生成组索引?

实现方法

可以用Pandas的组合操作高效完成需求,步骤清晰且性能最优:

  1. 计算分组最小值:先通过groupby获取每个Col分组对应的Val最小值,生成关联映射
  2. 按分组最小值排序:将原DataFrame与分组最小值关联,以此为键对整个DataFrame排序
  3. 生成分组索引:对排序后的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为索引的Series
  • merge(..., 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:50:45