Pandas:按规则拆分经连续重复值过滤的时间序列DataFrame
处理时间序列并拆分子DataFrame
你的过滤代码已经能正确保留最多连续2个相同值的行,但要实现按缺口拆分多个子DataFrame,关键是找到过滤后数据中索引断裂的位置(这些位置就是原始数据中被删除的连续重复值区域,即缺口),然后按这些位置分组拆分。
完整实现步骤
- 标记连续相同值的组内序号,筛选出最多连续2个的行;
- 检测过滤后数据的索引连续性,生成拆分分组标签;
- 根据分组标签拆分出多个子DataFrame。
代码实现
import pandas as pd def process_time_series(df, value_column): # 获取值序列 value_series = df[value_column] # 计算每个连续相同值组内的元素序号(从1开始) group_ids = value_series.ne(value_series.shift()).cumsum() within_group_idx = value_series.groupby(group_ids).cumcount() + 1 # 保留最多连续2个相同值的行 filtered_df = df[within_group_idx <= 2] # 检测索引断裂的位置,生成拆分分组标签 # 索引差大于1说明中间有被删除的行(缺口),以此作为拆分依据 split_groups = (filtered_df.index.diff() > 1).cumsum() # 拆分成多个子DataFrame并返回 return [sub_df for _, sub_df in filtered_df.groupby(split_groups)]
测试示例
# 构造带时间戳的测试数据 data = { 'timestamp': pd.date_range(start='2024-01-01', periods=12, freq='H'), 'value': [1, 3, 3, 5, 6, 6, 6, 7, 4, 5, 5, 1] } df = pd.DataFrame(data) # 处理并拆分 result_dfs = process_time_series(df, 'value') # 输出结果 for i, sub_df in enumerate(result_dfs): print(f"子DataFrame {i+1}:") print(sub_df) print("---")
输出结果
子DataFrame 1: timestamp value 0 2024-01-01 00:00:00 1 1 2024-01-01 01:00:00 3 2 2024-01-01 02:00:00 3 3 2024-01-01 03:00:00 5 4 2024-01-01 04:00:00 6 5 2024-01-01 05:00:00 6 --- 子DataFrame 2: timestamp value 7 2024-01-01 07:00:00 7 8 2024-01-01 08:00:00 4 9 2024-01-01 09:00:00 5 10 2024-01-01 10:00:00 5 11 2024-01-01 11:00:00 1 ---
说明
- 原始数据中连续3个6的第3个被过滤,对应的时间戳
2024-01-01 06:00:00形成缺口,拆分后的两个子DataFrame分别对应缺口前后的有效数据; - 如果原始数据是Series而非DataFrame,只需调整代码中针对DataFrame的部分,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Marco Rocchi
相关产品推荐
相关产品推荐

