为Pandas分组中的连续元素添加计数后缀
为Pandas DataFrame的连续Category组添加计数后缀
问题背景
已有包含category类型group列的DataFrame,需要为每组内连续出现的元素添加计数后缀,生成group_element_count列(非连续的同组元素需重新开始计数)。
示例数据初始化
import pandas as pd # 初始化数据,group为Categorical类型 df = pd.DataFrame({ 'group': pd.Categorical(['A', 'A', 'B', 'B', 'B', 'A', 'A', 'A']), 'value': [10, 20, 30, 40, 50, 60, 70, 80] })
期望输出
最终DataFrame需包含group_element_count列,效果如下:
| group | value | group_element_count |
|---|---|---|
| A | 10 | A_1 |
| A | 20 | A_2 |
| B | 30 | B_1 |
| B | 40 | B_2 |
| B | 50 | B_3 |
| A | 60 | A_1 |
| A | 70 | A_2 |
| A | 80 | A_3 |
解决方案代码
# 1. 生成连续分组的唯一标识:标记每一段连续相同的group df['block_id'] = df['group'].ne(df['group'].shift()).cumsum() # 2. 对每个连续分组内的元素计数,并拼接成目标列 df['group_element_count'] = ( df['group'].astype(str) + '_' + df.groupby('block_id').cumcount().add(1).astype(str) ) # 可选:删除中间辅助列block_id df = df.drop('block_id', axis=1)
代码解释
- 连续分组标识:
df['group'].ne(df['group'].shift())判断当前行与上一行的group是否不同,返回布尔值;.cumsum()将布尔值累加,生成唯一的block_id,每一段连续相同的group对应同一个block_id。 - 组内计数:
groupby('block_id').cumcount().add(1)在每个连续分组内从1开始计数(cumcount()默认从0开始,加1后符合日常计数习惯)。 - 拼接列:将
category类型的group转为字符串后,与计数拼接得到目标列。
内容的提问来源于stack exchange,提问作者newoptionz
相关产品推荐
相关产品推荐

