Pandas DataFrame新增序列列:满足二值列条件时生成连续序号否则为0
实现方案
情况1:与示例结果完全匹配(按B列分组统计)
你给出的示例是在每个B列的分类内,对C=1的行按出现顺序累计递增序号,C=0时D取值为0,一行代码即可实现:
df['D'] = df.groupby('B')['C'].cumsum().where(df['C'] == 1, 0)
原理说明:
groupby('B')['C'].cumsum()会在每个B分类下对C列做累加,由于C只有0和1两种取值,累加值刚好对应当前行是该B分类下第几个C=1的行where(df['C'] == 1, 0)会把C=0的行的计算结果替换为0,仅保留C=1行的累加值作为序号
情况2:不按B列分组,全局遇到C=0即重置序号
如果不需要考虑B列分类,只要遇到C=0就将后续C=1的序号从1重新开始计数,使用以下代码:
df['D'] = df.groupby((df['C'] == 0).cumsum()).cumcount().where(df['C'] == 1, 0)
原理说明:
(df['C'] == 0).cumsum()会给每一段连续的C=1的块分配同一个分组编号,每次遇到C=0编号就加1- 按该分组编号分组后调用
cumcount()得到组内行序号,C=1的行取对应行号作为D列值,C=0的行统一替换为0
注意点
如果运行时发现累加结果异常,可先将C列转为整数类型,避免浮点类型导致计算错误:
df['C'] = df['C'].astype(int)
内容的提问来源于stack exchange,提问作者vp_050
相关产品推荐
相关产品推荐

