如何按连续元素切片时间索引DataFrame,提取连续相同元素首个值
解决连续相同子序列首元素保留问题
嘿,这个需求用Pandas的内置方法就能轻松搞定,我来给你拆解一下实现步骤:
核心思路
我们需要识别出当前行的值和上一行不同的位置,这些位置正好对应每个连续相同子序列的第一个元素,再加上第一行(因为它没有上一行,肯定要保留)。
代码实现
假设你的DataFrame名为df,目标列是target_col,具体代码如下:
- 生成筛选掩码
# 比较当前行与上一行的值,标记不同的位置 mask = df['target_col'] != df['target_col'].shift()
shift()函数会把列数据整体下移一行,第一行填充NaN。和原列比较时,第一行会因为和NaN不等返回True,后续行只有和上一行值不同时才返回True——这正好是我们需要保留的行。
- 用掩码切片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
相关产品推荐
相关产品推荐

