如何按首次出现顺序为Pandas多重复行分配对应数值?
问题:按元素首次出现顺序生成编号列
我有如下DataFrame:
import pandas as pd df = pd.DataFrame({'Col1': ['A', 'A', 'C', 'A', 'C','B','A','B']})
希望生成Col2列,该列不按字母顺序,而是按元素首次出现的顺序分配数值,预期结果如下:
df = pd.DataFrame({'Col1': ['A', 'A', 'C', 'A', 'C','B','A','B'], 'Col2': [1, 1, 2, 1, 2, 3, 1, 3]})
我尝试了以下代码:
df['Col2'] = df.groupby(['Col1']).ngroup()
但得到的结果与预期不符,实际输出如下:
| Col1 | Col2 |
|---|---|
| A | 0 |
| A | 0 |
| C | 2 |
| A | 0 |
| C | 2 |
| B | 1 |
| A | 0 |
| B | 1 |
解决方案
方法1:使用pd.factorize()
pd.factorize()会按元素首次出现的顺序生成对应标签,默认从0开始,加1即可得到预期的1、2、3序列:
df['Col2'] = pd.factorize(df['Col1'])[0] + 1
方法2:使用Categorical类型
先提取Col1中元素首次出现的唯一值顺序,再将列转为分类类型并提取编码,最后加1:
# 获取元素首次出现的顺序 unique_order = df['Col1'].unique() df['Col2'] = pd.Categorical(df['Col1'], categories=unique_order).codes + 1
两种方法都能生成符合预期的Col2列,按A→C→B的首次出现顺序分配1、2、3编号。
内容的提问来源于stack exchange,提问作者cndze
相关产品推荐
相关产品推荐

