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

如何处理时间序列DataFrame的H/L集群,筛选极值生成交替序列?

问题描述

我有如下时间序列DataFrame:

Val1Val2HL
244.2233.05HNone
261.2252.8HNone
242.35235.8HNone
251.1244.55HNone
244.5239.55NoneL
271.25262.55HNone
274270.45HNone
245.05236.65NoneL
243.35237.55NoneL
255.7251.55HNone
248.8243.2NoneL
283.75272.15HNone
269.45262.7NoneL
260.6254.6HNone
285275NoneL
272.5265.35NoneL
267254.85NoneL
256.65253.5NoneL
268257.75HNone
272.1266.75HNone
281.45272.85NoneL
288.75282.05HNone
268.75264.5NoneL
283275.75NoneL
285.95278.15HNone
271.35265.2NoneL
308.15300HNone
312.85304.7HNone
311.55302.2NoneL
327.4318.65HNone
327319.5HNone
318.7313.9NoneL
293.1283.45NoneL
306301.5HNone
303.9296.2NoneL
293.4261.55NoneL
302.8298.1HNone
293.7289.05NoneL
267.95264.05NoneL
276.55273.2HNone
268.15255NoneL
314303.9NoneL
324.2311.05HNone
332.35323.8HNone
312.35306.3HNone
308.4300.2NoneL
312.5308.55NoneL
365.7355.6HNone
334318.8HNone
319.3313.95NoneL
327.8323.15HNone

我需要生成H与L值交替的DataFrame,但当前DataFrame中H、L字段存在连续集群的情况,需筛选出H集群中的最大值、L集群中的最小值,目标DataFrame如下:

Val1Val2HL
261.2252.8HNone
244.5239.55NoneL
274270.45HNone
245.05236.65NoneL
255.7251.55HNone
248.8243.2NoneL
283.75272.15HNone
269.45262.7NoneL
260.6254.6HNone
256.65253.5NoneL
272.1266.75HNone
281.45272.85NoneL
288.75282.05HNone
268.75264.5NoneL
285.95278.15HNone
271.35265.2NoneL
312.85304.7HNone
311.55302.2NoneL
327.4318.65HNone
293.1283.45NoneL
306301.5HNone
293.4261.55NoneL
302.8298.1HNone
267.95264.05NoneL
276.55273.2HNone
268.15255NoneL
332.35323.8HNone
308.4300.2NoneL
365.7355.6HNone
319.3313.95NoneL
327.8323.15HNone

我已经尝试了pandas的多种函数,但始终无法得到预期结果。


解决方案

可以通过集群分组+条件聚合的方式实现需求,具体步骤如下:

  1. 标记连续集群:通过判断H列的非空状态变化,为连续的H或L集群分配唯一分组ID;
  2. 按集群聚合:对每个H集群,保留Val1最大的行;对每个L集群,保留Val1最小的行;
  3. 整理结果:去除临时分组列,重置索引得到最终交替的DataFrame。

代码实现

import pandas as pd

# 假设原始数据已加载到df中(可根据实际情况替换数据加载逻辑)
# df = pd.read_csv("your_data.csv")  # 示例加载方式

# 1. 创建集群分组标签:连续的H/L为同一组
df['cluster_id'] = (df['H'].notna() != df['H'].notna().shift()).cumsum()

# 2. 定义聚合逻辑:H集群取Val1最大行,L集群取Val1最小行
def process_cluster(group):
    if group['H'].notna().any():
        # H集群:筛选Val1最大值对应的行
        return group[group['Val1'] == group['Val1'].max()]
    else:
        # L集群:筛选Val1最小值对应的行
        return group[group['Val1'] == group['Val1'].min()]

# 3. 应用聚合并整理结果
result_df = df.groupby('cluster_id').apply(process_cluster).reset_index(drop=True)
result_df = result_df.drop(columns='cluster_id')

# 查看结果
print(result_df)

代码说明

  • df['H'].notna().shift():将H列的非空状态向下偏移一行,用于判断当前行与上一行是否属于同一集群;
  • cumsum():对状态变化的标记累加,生成唯一的集群ID;
  • groupby('cluster_id').apply(process_cluster):按集群分组后,对每个组执行自定义的筛选逻辑,确保每个集群只保留符合要求的一行。

运行上述代码后,得到的结果将与目标DataFrame完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:20:21