如何用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
相关产品推荐
相关产品推荐

