如何为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)
代码说明
- 分组标记:通过
(df['ATEXT'] == '').cumsum()将空行作为分隔符,把连续的非空行划分为同一组,确保每组内的首次值判断仅在当前连续段内生效。 - 首次出现判断:利用
groupby(groups)结合transform,为每个分组内的每个值标记第一次出现的位置。 - 编号填充:遍历每行数据,仅当该行是分组内首次出现的有效值时,通过映射字典获取对应编号,其余情况留空。
内容的提问来源于stack exchange,提问作者mxplk
相关产品推荐
相关产品推荐

