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

如何按连续元素切片时间索引DataFrame,提取连续相同元素首个值

解决连续相同子序列首元素保留问题

嘿,这个需求用Pandas的内置方法就能轻松搞定,我来给你拆解一下实现步骤:

核心思路

我们需要识别出当前行的值和上一行不同的位置,这些位置正好对应每个连续相同子序列的第一个元素,再加上第一行(因为它没有上一行,肯定要保留)。

代码实现

假设你的DataFrame名为df,目标列是target_col,具体代码如下:

  1. 生成筛选掩码
# 比较当前行与上一行的值,标记不同的位置
mask = df['target_col'] != df['target_col'].shift()

shift()函数会把列数据整体下移一行,第一行填充NaN。和原列比较时,第一行会因为和NaN不等返回True,后续行只有和上一行值不同时才返回True——这正好是我们需要保留的行。

  1. 用掩码切片DataFrame
# 筛选出符合条件的行
result_df = df[mask]

示例验证

我们用你给出的示例数据来测试一下:

import pandas as pd

# 构造带时间索引的示例DataFrame
data = {'target_col': ['x','x','y','y','x','x','x','y','y','y','y','x']}
df = pd.DataFrame(
    data,
    index=pd.date_range('2024-01-01 00:00', periods=12, freq='H')
)

# 生成掩码并筛选
mask = df['target_col'] != df['target_col'].shift()
result_df = df[mask]

print(result_df)

运行后输出的result_df就会包含每个连续子序列的首个元素,对应的时间索引也会完整保留:

target_col
2024-01-01 00:00:00          x
2024-01-01 02:00:00          y
2024-01-01 04:00:00          x
2024-01-01 07:00:00          y
2024-01-01 11:00:00          x

额外说明

如果你的目标列中存在NaN值,可以调整掩码来适配这种情况,比如:

# 保留首次出现的NaN块,以及值变化的位置
mask = (df['target_col'] != df['target_col'].shift()) | df['target_col'].isna().shift().fillna(True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:28:10