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

如何为DataFrame分组中首次出现的唯一值添加编号列num?

问题:为DataFrame中首次出现的指定值分配编号

需求说明

在每组连续非空数据中,需为每个首次出现的唯一值在新列num中分配指定编号:

  • AF → 1
  • CT → 2
  • RT → 3
  • CTS → 4
    后续重复值及空值不填充编号。

现有DataFrame

import pandas as pd

data = {'ATEXT': ['AF', 'AF', '', '', 'CT', 'RT', '', 'AF', 'AF', 'CTS', 'AF', 'AF', 'AF', 'CT',
                  'AF', 'CT', 'AF', 'AF', 'AF', 'AF', 'RT', 'RT', '', '', 'AF', 'CT', 'CT', 'RT',
                  'AF', 'AF', 'CT']}
df = pd.DataFrame(data)

期望结果

ATEXT num
0     AF   1
1     AF    
2           
3           
4     CT   2
5     RT   3
6           
7     AF   1
8     AF    
9    CTS   4
10    AF    
11    AF    
12    AF    
13    CT   2
14    AF    
15    CT    
16    AF    
17    AF    
18    AF    
19    AF    
20    RT   3
21    RT    
22          
23          
24    AF   1
25    CT   2
26    CT    
27    RT   3
28    AF    
29    AF    
30    CT

尝试的无效代码

nl = df['ATEXT']!=("")
df['num'] = (df['ATEXT'].mask(nl)
        .groupby(nl)
        .where(~df.ATEXT.duplicated()
        )

解决方案

完整代码

import pandas as pd

data = {'ATEXT': ['AF', 'AF', '', '', 'CT', 'RT', '', 'AF', 'AF', 'CTS', 'AF', 'AF', 'AF', 'CT',
                  'AF', 'CT', 'AF', 'AF', 'AF', 'AF', 'RT', 'RT', '', '', 'AF', 'CT', 'CT', 'RT',
                  'AF', 'AF', 'CT']}
df = pd.DataFrame(data)

# 定义值与编号的映射关系
value_map = {'AF': '1', 'CT': '2', 'RT': '3', 'CTS': '4'}

# 按空值分割,创建连续非空数据的分组标记
groups = (df['ATEXT'] == '').cumsum()

# 标记每个分组内首次出现的有效值
df['is_first_in_group'] = df.groupby(groups)['ATEXT'].transform(lambda x: ~x.duplicated())

# 填充num列:仅首次出现的有效值分配编号,其余留空
df['num'] = df.apply(
    lambda row: value_map.get(row['ATEXT'], '') if row['is_first_in_group'] and row['ATEXT'] != '' else '',
    axis=1
)

# 移除辅助列(可选)
df.drop('is_first_in_group', axis=1, inplace=True)

print(df)

代码说明

  1. 分组标记:通过(df['ATEXT'] == '').cumsum()将空行作为分隔符,把连续的非空行划分为同一组,确保每组内的首次值判断仅在当前连续段内生效。
  2. 首次出现判断:利用groupby(groups)结合transform,为每个分组内的每个值标记第一次出现的位置。
  3. 编号填充:遍历每行数据,仅当该行是分组内首次出现的有效值时,通过映射字典获取对应编号,其余情况留空。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:55:59