Pandas如何保留时间序列中连续重复块的首条记录?
保留连续重复块首条记录的Pandas解决方案
要实现仅保留连续重复值块的首条记录(而非全局去重),可以利用Pandas的shift()方法生成布尔掩码来筛选目标行,这恰好适配pd.merge_asof对缓变时间序列的压缩需求。
核心代码
假设你的DataFrame中,时间列为索引,值列名为value:
# 生成掩码:当前行值与上一行不同时标记为True mask = df['value'] != df['value'].shift() # 筛选得到压缩后的DataFrame compressed_df = df[mask]
原理说明
df['value'].shift()会将上一行的value值下移一行,第一行的移位结果为NaNNaN与任何值比较都会返回True,因此第一行会被保留- 后续行仅当值发生变化时(即进入新的连续重复块)才会被选中,完美保留每个块的起始记录
示例验证
针对你提供的原始数据:
2023-01-01 A 2023-01-02 B 2023-01-03 B 2023-01-04 B 2023-01-05 C 2023-01-06 C 2023-01-07 A 2023-01-08 B
执行代码后得到的compressed_df即为目标结果:
2023-01-01 A 2023-01-02 B 2023-01-05 C 2023-01-07 A 2023-01-08 B
替代方案(分组法)
如果需要更直观的分组逻辑,也可以通过生成连续分组键来实现:
# 创建连续重复块的分组键 df['group_key'] = (df['value'] != df['value'].shift()).cumsum() # 按分组取首条记录并删除临时键 compressed_df = df.groupby('group_key').first().drop(columns='group_key')
内容的提问来源于stack exchange,提问作者user2966608
相关产品推荐
相关产品推荐

