如何用向量化方法统计DataFrame中距最近col=1行的行数
高效向量化实现Pandas中最近1值的行数统计
问题描述
现有如下Pandas DataFrame:
| id_ | col |
|---|---|
| 1 | 0 |
| 2 | 1 |
| 3 | 0 |
| 4 | 0 |
| 5 | 1 |
| 6 | 0 |
| 7 | 0 |
需要新增一列count,统计每行距离最近的上一个col值为1的行的行数,最终目标结果如下:
| id_ | col | count |
|---|---|---|
| 1 | 0 | |
| 2 | 1 | |
| 3 | 0 | 1 |
| 4 | 0 | 2 |
| 5 | 1 | 3 |
| 6 | 0 | 1 |
| 7 | 0 | 2 |
要求避免循环,使用高效的向量化方法实现。
向量化解决方案
以下是无需循环的高效实现代码,完全基于Pandas内置的向量化操作:
import pandas as pd # 生成原始DataFrame df = pd.DataFrame( { 'id_': [1, 2, 3, 4, 5, 6, 7], 'col': [0, 1, 0, 0, 1, 0, 0] } ) # 1. 标记所有col=1的行索引,向前填充得到每行对应的最近上一个1的索引 last_one_idx = df['col'].where(df['col'] == 1).ffill() # 2. 计算当前行与最近上一个1的行索引差,即为count值 df['count'] = df.index - last_one_idx # 3. 处理特殊行:第一个1之前的行、col=1的行,设置count为空 df.loc[(last_one_idx.isna()) | (df['col'] == 1), 'count'] = None # 转换为支持空值的整数类型(保持结果格式一致) df['count'] = df['count'].astype('Int64') print(df)
代码解释
last_one_idx生成:通过where筛选出col=1的行索引,其余位置设为NaN;再用ffill()向前填充,确保每行都能获取到最近的上一个1的行索引。- 计数计算:直接用当前行索引减去
last_one_idx,得到的差值就是距离最近上一个1的行数,完全向量化计算,效率极高。 - 特殊值处理:将第一个1之前的行(无前置1)和col=1本身的行的
count设为空值,匹配需求格式。 - 类型转换:使用
Int64类型(注意大写I),支持整数类型的空值,避免出现float类型的NaN。
输出结果
运行代码后得到的DataFrame与目标完全一致:
| id_ | col | count |
|---|---|---|
| 1 | 0 | |
| 2 | 1 | |
| 3 | 0 | 1 |
| 4 | 0 | 2 |
| 5 | 1 | 3 |
| 6 | 0 | 1 |
| 7 | 0 | 2 |
内容的提问来源于stack exchange,提问作者Jossy
相关产品推荐
相关产品推荐

