You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用向量化方法统计DataFrame中距最近col=1行的行数

高效向量化实现Pandas中最近1值的行数统计

问题描述

现有如下Pandas DataFrame:

id_col
10
21
30
40
51
60
70

需要新增一列count,统计每行距离最近的上一个col值为1的行的行数,最终目标结果如下:

id_colcount
10
21
301
402
513
601
702

要求避免循环,使用高效的向量化方法实现。

向量化解决方案

以下是无需循环的高效实现代码,完全基于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)

代码解释

  1. last_one_idx生成:通过where筛选出col=1的行索引,其余位置设为NaN;再用ffill()向前填充,确保每行都能获取到最近的上一个1的行索引。
  2. 计数计算:直接用当前行索引减去last_one_idx,得到的差值就是距离最近上一个1的行数,完全向量化计算,效率极高。
  3. 特殊值处理:将第一个1之前的行(无前置1)和col=1本身的行的count设为空值,匹配需求格式。
  4. 类型转换:使用Int64类型(注意大写I),支持整数类型的空值,避免出现float类型的NaN。

输出结果

运行代码后得到的DataFrame与目标完全一致:

id_colcount
10
21
301
402
513
601
702

内容的提问来源于stack exchange,提问作者Jossy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:15:47