如何过滤Pandas中连续n行数值不变的“平线”数据
过滤连续n行数值不变的数据点
需求:识别出连续至少n行数值相同的数据段,过滤掉该段内所有行,保留其余数据。以下以n=6为例实现:
示例数据
import pandas as pd data={'col1':[1, 3, 3, 3, 3, 3, 3, 3, 3, 4, 1, 1, 1, 1, 1]} df=pd.DataFrame(data,columns=['col1'])
实现代码
n = 6 # 连续行数阈值 # 生成连续相同值的分组键:每遇到与上一行不同的值,分组编号+1 group_key = df['col1'].ne(df['col1'].shift()).cumsum() # 计算每个分组的长度,并映射到每一行 group_size = df.groupby(group_key)['col1'].transform('size') # 生成过滤规则:分组长度小于n的保留(True),否则标记为待过滤(False) flatline_filter = group_size < n # 合并原数据与过滤列,查看标记结果 result = df.assign(flatline_filter=flatline_filter) print(result)
输出结果
col1 flatline_filter 0 1 True 1 3 False 2 3 False 3 3 False 4 3 False 5 3 False 6 3 False 7 3 False 8 3 False 9 4 True 10 1 True 11 1 True 12 1 True 13 1 True 14 1 True
执行过滤
用生成的flatline_filter筛选DataFrame:
filtered_df = df[flatline_filter] print(filtered_df)
逻辑说明
df['col1'].ne(df['col1'].shift()):对比当前行与上一行的值,返回布尔值(不同为True,相同为False)cumsum():对布尔值累加,生成连续相同值的分组编号,确保连续相同值属于同一组transform('size'):将每个分组的总长度映射到组内每一行,让每行知道自己所在分组的规模- 最终通过
group_size < n判断:分组长度小于阈值的行保留,连续达到或超过n行的整段数据标记为待过滤
内容的提问来源于stack exchange,提问作者theuema
相关产品推荐
相关产品推荐

