如何实现当DataFrame中merged_attribute列值变化时自动递增的整数计数器
解决DataFrame按列值变化生成计数器的问题
刚好我之前也遇到过类似的需求,用pandas的几个内置方法就能快速搞定,给你两种靠谱的方案:
方案一:基于值变化检测的累加计数
这种方法完美匹配你示例里连续相同值归为同一组的场景,核心是检测MERGED_ATRIBUTE列的前后值变化,然后对变化点做累加:
import pandas as pd # 假设你的DataFrame名为df df['COUNTER'] = (df['MERGED_ATRIBUTE'] != df['MERGED_ATRIBUTE'].shift()).cumsum()
原理说明:
df['MERGED_ATRIBUTE'].shift():把列整体向下偏移一行,这样就能和原列逐行比较df['MERGED_ATRIBUTE'] != df['MERGED_ATRIBUTE'].shift():返回布尔值,当值发生变化时为True(对应1),否则为False(对应0).cumsum():对布尔值序列做累加,自动把True转成1累加,最终得到连续相同值的分组序号
方案二:基于分组的序号分配
如果你希望所有相同的MERGED_ATRIBUTE值都归为同一组(即使不连续出现),可以用groupby配合ngroup():
df['COUNTER'] = df.groupby('MERGED_ATRIBUTE').ngroup() + 1
原理说明:
groupby('MERGED_ATRIBUTE'):按目标列的值分组ngroup():给每个组分配从0开始的序号,加1是为了让计数器从1开始(和你的示例一致)
验证效果
用你给出的测试DataFrame运行任意一种方案,都能得到你期望的COUNTER列结果:
| Price | UNIQUE | MERGED_ATRIBUTE | COUNTER |
|---|---|---|---|
| 52.08 | 1 | 52.081 | 1 |
| 52.08 | 1 | 52.081 | 1 |
| 52.20 | 1 | 52.210 | 2 |
| 52.20 | 1 | 52.210 | 2 |
| 52.20 | 1 | 52.210 | 2 |
| 52.20 | 1 | 52.210 | 2 |
| 52.20 | 1 | 52.210 | 2 |
| 52.20 | 1 | 52.210 | 2 |
| 70.10 | 1 | 70.110 | 3 |
内容的提问来源于stack exchange,提问作者MachuPichu92
相关产品推荐
相关产品推荐

