如何在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列:
| name | visit | foo | enum | |
|---|---|---|---|---|
| 0 | andrew | BL | a | 1 |
| 1 | andrew | BL | a | 1 |
| 2 | andrew | BL | b | 2 |
| 3 | andrew | BL | b | 2 |
| 4 | bob | BL | c | 1 |
| 5 | bob | BL | c | 1 |
| 6 | bob | BL | d | 2 |
| 7 | bob | BL | d | 2 |
| 8 | bob | M12 | e | 1 |
| 9 | bob | M12 | e | 1 |
| 10 | bob | M12 | f | 2 |
| 11 | bob | M12 | g | 3 |
| 12 | carol | BL | h | 1 |
| 13 | carol | BL | i | 2 |
| 14 | carol | BL | j | 3 |
| 15 | carol | BL | k | 4 |
内容的提问来源于stack exchange,提问作者ajwood
相关产品推荐
相关产品推荐

