基于categ列的0值重置Run_count计数,生成desiredResults
解决计数重置问题的修改方案
问题核心是原代码的计数逻辑没有考虑categ列的分段——当categ从0回到1时,计数没有重置。我们需要先按categ的连续1块分组,再在每个分组内统计value=1的连续块计数。
修改后的完整代码
import pandas as pd import numpy as np data = pd.DataFrame( {"categ": [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1], "value": [0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1], "Run_count": [0, 1, 1, 0, 0, 2, 0, 3, 0, 0, 0, 4, 4, 0, 0, 0, 0, 5, 5, 0, 0, 6], "currentResults": [0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 0, 0, 5, 5, 5, 5, 6, 6, 6], "desiredResults": [0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 0, 0, 0, 0, 1, 1, 2, 2, 2], }) # 1. 生成categ连续为1的分组标记,每次categ为0后,下一个1的组会重新编号 categ_groups = data['categ'].ne(0).cumsum() # 2. 在每个categ组内,生成value=1的非NaN分组标记(分隔连续的value=1块) value_groups = data['value'].where(data['value'].eq(1)).isna().groupby(categ_groups).cumsum() # 3. 计算Run_count:在每个categ组+value组内,对value=1的行从1开始计数,其余行设为0 data['Run_count'] = data.groupby([categ_groups, value_groups])['value'].transform( lambda x: x.ne(0).cumsum() if x.any() else 0 ).where(data['value'].eq(1), 0) # 4. 生成最终结果,逻辑与原代码一致,但Run_count已按categ分段重置 data['currentResults'] = np.where(data['categ']==1, data['Run_count'].bfill(), 0) # 验证结果是否匹配desiredResults print(data[['currentResults', 'desiredResults']])
关键步骤说明
categ_groups:用ne(0).cumsum()把连续的categ=1区间分成独立分组,比如索引1-12是一组,索引15-21是另一组,确保跨categ=0的区间计数会重置。value_groups:在每个categ分组内,统计value=1的空值累积,把同一categ组内的value=0段作为分隔,区分不同的value=1连续块。- Run_count计算:通过嵌套分组
[categ_groups, value_groups],让每个categ组内的value=1块从1开始重新计数,而不是全局累加。
运行后currentResults会完全匹配desiredResults的预期值。
内容的提问来源于stack exchange,提问作者aaaahhhhhh
相关产品推荐
相关产品推荐

