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

Pandas:根据出现顺序替换DataFrame分类列B的取值

将Pandas分组列转换为连续编号的分类组名

问题背景

我有一个包含1000条记录的Pandas DataFrame,其中B列是已排序的分组列,数据结构如下:

import pandas as pd
df = pd.DataFrame([['red', 0], ['green', 0], ['blue', 16],['white', 58],['yellow', 59], ['purple', 71], ['violet', 82],['grey', 82]], columns=['A','B'])
# 输出结果
#       A     B
# 0   red     0
# 1   green   0
# 2   blue    16
# 3   white   58
# 4   yellow  59
# 5   purple  71
# 6   violet  82
# 7   grey    82

需要将B列更新为连续编号的组名(如group1、group2...),使相同B值对应同一个组名,最终输出如下:

output_df = pd.DataFrame([['red', 'group1'], ['green', 'group1'], ['blue', 'group2'],['white', 'group3'],['yellow', 'group4'], ['purple', 'group5'], ['violet', 'group6'],['grey', 'group6']], columns=['A','B'])
# 输出结果
#           A     B
# 0   red     group1
# 1   green   group1
# 2   blue    group2
# 3   white   group3
# 4   yellow  group4
# 5   purple  group5
# 6   violet  group6
# 7   grey    group6

解决方案

方法1:使用pd.factorize()

factorize()会将列中的唯一值映射为连续整数,直接拼接前缀即可生成目标组名:

df['B'] = 'group' + (pd.factorize(df['B'])[0] + 1).astype(str)

解释:pd.factorize(df['B'])[0]返回从0开始的唯一值编号,加1后转为字符串,与group拼接得到符合要求的组名。

方法2:使用groupby().ngroup()

通过分组获取组的连续编号,再拼接前缀:

df['B'] = 'group' + (df.groupby('B').ngroup() + 1).astype(str)

解释:按B列分组后,ngroup()为每个组分配从0开始的连续ID,加1后拼接字符串生成组名。

方法3:利用diff()和cumsum()生成组编号

由于B列已排序,可通过判断值的变化来累加生成组编号:

# 标记B值变化的位置,累加得到组编号
group_num = (df['B'].diff() != 0).cumsum()
df['B'] = 'group' + group_num.astype(str)

解释:df['B'].diff() != 0在B值与前一行不同时返回True,cumsum()累加这些布尔值(True=1,False=0)得到连续组编号,再拼接前缀即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:10:45