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
相关产品推荐
相关产品推荐

