如何为DataFrame中连续重复的分组值分配递增分类编号
如何为DataFrame中连续重复的分组值分配递增分类编号
嘿,这个需求我太熟了!用Pandas的原生矢量化操作就能完美解决,完全不用写繁琐的for循环,代码简洁还高效,数据量大的时候优势特别明显。
先还原你的示例数据:
import pandas as pd my_list = ['Apple', 'Apple', 'Orange', 'Orange','Orange','Banana'] grouping = pd.DataFrame(my_list, columns=['List'])
要实现给连续重复的分组分配递增编号,只需要一行代码就能搞定:
# 生成递增的分类编号列 grouping['Value'] = grouping['List'].ne(grouping['List'].shift()).cumsum()
运行后你就能得到预期的结果:
| List | Value | |
|---|---|---|
| 0 | Apple | 1 |
| 1 | Apple | 1 |
| 2 | Orange | 2 |
| 3 | Orange | 2 |
| 4 | Orange | 2 |
| 5 | Banana | 3 |
我来拆解下这段代码的逻辑:
grouping['List'].shift():把List列的所有元素向下偏移一行,这样就能让当前行和上一行的元素做对比ne():是“not equal”的缩写,用来判断当前行和上一行的元素是否不同,不同返回True(对应数值1),相同返回False(对应数值0)cumsum():对前面得到的布尔值序列做累加,每遇到一个True就会让总数加1,刚好实现“换组就递增编号”的效果
对比你之前用for循环的思路,这个方法是Pandas的矢量化操作,避免了逐行遍历的性能开销,数据量越大,速度差距越明显,而且代码可读性也更高。
另外要注意和factorize()区分开:pd.factorize(grouping['List'])[0] + 1会给所有相同的元素分配同一个编号(比如如果你的列表后面又出现Apple,它会继续用1),但你的需求是连续重复的组,所以我们上面的方法才是精准匹配的选择。
内容来源于stack exchange
相关产品推荐
相关产品推荐

