如何用Pandas筛选包含至少连续5个正值的时间序列列
筛选含至少连续5个非空正值的时间序列列
给定的时间序列数据集中部分列存在大量空值,需要筛选出包含至少连续5个非空正值的列,最终预期得到3个符合条件的序列。
数据集回顾
import pandas as pd df = pd.DataFrame({'date': ['2019-01-06 00:00:00','2019-01-13 00:00:00','2019-01-27 00:00:00', '2019-02-03 00:00:00','2019-02-10 00:00:00','2019-02-17 00:00:00', '2019-02-24 00:00:00','2019-03-03 00:00:00','2019-03-10 00:00:00', '2019-03-17 00:00:00'], 'timeseries1': [None, None, None, 5, 10, 5, 10, 5, 8, 15], 'timeseries2': [4, 4, None, 4, None, None, 5, 9, 6, 12], 'timeseries3': [None, 5, 9, 6, 12, 10, None, None, None, None], 'timeseries4': [None, None, 9, None, 10, 5, 8, None, 7, None], 'timeseries5': [None, 5, 5, 10, 5, 8, 15, 9, None, None] }) df = df.set_index('date')
解决方案代码
# 1. 标记每个值是否为非空有效正值(此处数据均为正值,只需判断非空) valid_mask = df.notna() # 2. 计算每列的连续非空值计数:遇到空值时重置计数 consecutive_counts = valid_mask.cumsum() - valid_mask.cumsum().where(~valid_mask).ffill().fillna(0) # 3. 获取每列的最大连续非空长度 max_consecutive = consecutive_counts.max() # 4. 筛选出最大连续长度≥5的列 selected_columns = max_consecutive[max_consecutive >= 5].index # 5. 提取符合条件的时间序列 filtered_df = df[selected_columns] # 查看结果 print(filtered_df)
结果说明
运行上述代码后,筛选出的列是 timeseries1、timeseries3、timeseries5,与预期一致:
timeseries1:从第4行开始有连续7个非空值timeseries3:从第2行到第6行有连续5个非空值timeseries5:从第2行到第8行有连续7个非空值
内容的提问来源于stack exchange,提问作者kevin
相关产品推荐
相关产品推荐

