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

如何用Python查找DataFrame中连续N行相同非NaN值?

查找DataFrame中连续N行相同非NaN值的解决方案

不用for循环,用pandas的矢量化分组方法更高效,还能避免行位置定位的问题。以下是具体实现:

步骤与代码示例

假设我们有如下示例DataFrame:

import pandas as pd
import numpy as np

# 构造测试数据
df = pd.DataFrame({
    'value': [1, 1, 1, np.nan, 2, 2, np.nan, np.nan, 3, 3, 3, 3]
})

1. 生成连续相同值的分组ID

通过对比当前行与上一行的值,生成分组ID,同时排除NaN值的干扰:

# 标记非NaN行
non_nan = df['value'].notna()
# 生成连续相同值的分组ID:值变化时ID递增
group_id = (df['value'] != df['value'].shift()) | ~non_nan
group_id = group_id.cumsum()

2. 统计每组的连续行数

用分组ID对DataFrame分组,统计每组的行数,再合并回原DataFrame:

# 计算每个分组的长度
group_length = df.groupby(group_id)['value'].transform('size')
# 仅保留非NaN行的长度,NaN行设为0
group_length = group_length.where(non_nan, 0)
df['continuous_length'] = group_length

3. 筛选出连续N行的目标行

假设N=3,筛选出连续长度>=N的行:

N = 3
result = df[df['continuous_length'] >= N]
print(result)

运行后输出:

value  continuous_length
0     1.0                  3
1     1.0                  3
2     1.0                  3
8     3.0                  4
9     3.0                  4
10    3.0                  4
11    3.0                  4

关于调试异常的说明

你遇到的VSCode调试提示和for循环异常,大概率是因为手动遍历行时的索引处理问题(比如忽略了NaN行、索引不连续等)。上面的矢量化方法完全避开了for循环,不仅效率更高,也能避免这类调试问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:55:16