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

如何在Pandas中对['name','visit']分组内的foo子分组进行枚举?

解决方案:分组内枚举唯一foo值

这是个很常见的分组内唯一值枚举需求,用Pandas可以轻松实现,这里提供两种可靠的方法:

方法1:factorize + transform组合

factorize会把分组内的每个唯一foo值映射成从0开始的整数,我们只需加1就能得到从1开始的枚举编号;transform方法则保证处理后的结果能精准对应回原DataFrame的每一行:

import pandas as pd

# 构造你提供的示例DataFrame
df = pd.DataFrame({
    'name': ['andrew']*4 + ['bob']*8 + ['carol']*4,
    'visit': ['BL']*4 + ['BL']*4 + ['M12']*4 + ['BL']*4,
    'foo': ['a','a','b','b','c','c','d','d','e','e','f','g','h','i','j','k']
})

# 生成enum列
df['enum'] = df.groupby(['name', 'visit'])['foo'].transform(lambda x: pd.factorize(x)[0] + 1)

方法2:使用rank方法

利用rank的dense参数可以实现连续排名——相同的foo值会共享同一个排名,且排名不会出现间隔,最后转成整数类型就完全符合需求了:

df['enum'] = df.groupby(['name', 'visit'])['foo'].rank(method='dense', ascending=True).astype(int)

最终结果验证

执行任意一种方法后,你的DataFrame都会生成符合预期的enum列:

namevisitfooenum
0andrewBLa1
1andrewBLa1
2andrewBLb2
3andrewBLb2
4bobBLc1
5bobBLc1
6bobBLd2
7bobBLd2
8bobM12e1
9bobM12e1
10bobM12f2
11bobM12g3
12carolBLh1
13carolBLi2
14carolBLj3
15carolBLk4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:29:21