pandas中基于列组合分配非数值类别型分组ID的实现问题
分组ID生成解决方案
问题原因
- 原有代码中groupby指定的列名和实际列名不匹配:原始数据的列名为
Col 1、Col 2,代码中写的Col、Col2会导致报错。 ngroup()方法返回的是整数类型,即使通过astype('category')转换为分类类型,其取值依然为数字,不符合非数值类别的需求。
实现代码
你可以将ngroup()生成的数字ID映射为大写字母,再转换为分类类型即可实现需求:
# 按两列组合生成数字分组ID data['GroupID'] = data.groupby(['Col 1', 'Col 2']).ngroup() # 将数字ID映射为大写字母,0对应A、1对应B,以此类推 data['GroupID'] = data['GroupID'].apply(lambda x: chr(ord('A') + x)).astype('category')
如果你本身已经提前计算好了Combination列,也可以直接基于该列生成映射:
# 生成组合与字母ID的映射字典 comb_map = {comb: chr(ord('A') + idx) for idx, comb in enumerate(data['Combination'].unique())} # 映射生成GroupID并转换为分类类型 data['GroupID'] = data['Combination'].map(comb_map).astype('category')
补充说明
如果你的分组数量超过26个,需要更长的字母组合(类似Excel列名AA、AB这类格式),可以替换上面的映射逻辑,适配多字母生成规则即可。
内容的提问来源于stack exchange,提问作者archer
相关产品推荐
相关产品推荐

