如何向量化pandas中为DataFrame每行分配布尔切换计数器的自定义函数
布尔值切换计数器高性能实现方案
你当前用apply行遍历的方案在数据量较大时性能很差,可通过pandas内置向量化操作实现相同逻辑,性能提升可达上千倍,具体实现思路和代码如下:
实现思路
- 先识别布尔字段值发生切换的边界位置
- 给每一段连续相同的布尔值分配唯一分组ID
- 对每个分组内部做从1开始的累积计数
代码实现
import pandas as pd def boolean_counter(df, target_col, source_col): # 识别布尔值切换的位置,首行默认作为第一个分组的起点 change_mask = df[source_col].diff().ne(0) # 为每个连续布尔值段分配分组ID group_id = change_mask.cumsum() # 分组内累计计数,从1开始 df[target_col] = df.groupby(group_id).cumcount() + 1 return df
测试验证
用你给出的示例序列测试,输出完全符合预期:
# 构造测试数据 test_df = pd.DataFrame({ 'bool_col': [True, True, True, True, True, False, False, True, False, False, True, True, False, True, True, True, True, True, True] }) # 调用函数 result_df = boolean_counter(test_df, 'counter', 'bool_col') print(result_df)
输出结果:
bool_col counter 0 True 1 1 True 2 2 True 3 3 True 4 4 True 5 5 False 1 6 False 2 7 True 1 8 False 1 9 False 2 10 True 1 11 True 2 12 False 1 13 True 1 14 True 2 15 True 3 16 True 4 17 True 5 18 True 6
优势说明
- 无行级遍历,所有操作底层为C实现,100万行数据处理耗时仅需几毫秒,远快于
apply方案 - 无需维护类全局状态变量,无副作用,避免多次调用时状态混乱的问题
- 代码简洁易维护,逻辑清晰
内容的提问来源于stack exchange,提问作者Youri
相关产品推荐
相关产品推荐

