在Pandas中计算status列连续零值序列的长度
按分组填充连续零值序列长度到DataFrame的gap列
给定如下结构的DataFrame:
| Unit | status | date |
|---|---|---|
| One | 1 | 1 |
| One | 1 | 2 |
| One | 1 | 3 |
| One | 0 | 4 |
| One | 0 | 5 |
| One | 1 | 6 |
| One | 1 | 7 |
需要新增gap列,规则为:
- 连续零值序列的所有行填充该序列的总长度
- 非零值行填充0
最终输出示例:
| Unit | status | date | gap |
|---|---|---|---|
| One | 1 | 1 | 0 |
| One | 1 | 2 | 0 |
| One | 1 | 3 | 0 |
| One | 0 | 4 | 2 |
| One | 0 | 5 | 2 |
| One | 1 | 6 | 0 |
| One | 1 | 7 | 0 |
要求对所有Unit分组执行该操作。
解决方案
通过Pandas的分组(groupby)和变换(transform)方法实现,核心是先标记出每个连续零值的序列组,再将组的长度广播到组内所有行:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Unit': ['One']*7, 'status': [1,1,1,0,0,1,1], 'date': [1,2,3,4,5,6,7] }) # 1. 生成分组标识:按Unit分组,同时用非零值的累加标记连续零值的子组 group_key = ['Unit', (df['status'] != 0).cumsum()] # 2. 计算子组长度,仅保留零值行的长度,非零行设为0 df['gap'] = df.groupby(group_key)['status'].transform('size').where(df['status'] == 0, 0) print(df)
关键逻辑说明
(df['status'] != 0).cumsum():非零值会触发累加计数,连续零值会继承前一个非零段的计数,从而把所有连续零值归为同一子组groupby(group_key).transform('size'):计算每个子组的行数(即连续零值的序列长度),并将该值广播到组内每一行where(df['status'] == 0, 0):筛选出零值行保留组长度,非零行直接替换为0
内容的提问来源于stack exchange,提问作者Eduardo Pacheco
相关产品推荐
相关产品推荐

