如何基于bool列去除Pandas DataFrame中的连续重复行?
问题
我有如下数据集,希望基于bool列去除连续重复的行:
原始数据集
| datetime | number | bool |
|---|---|---|
| 2023-02-14 10:15:00 | 195.35 | FALSE |
| 2023-02-14 11:15:00 | 195.8 | FALSE |
| 2023-02-14 12:15:00 | 195.87 | FALSE |
| 2023-02-14 13:15:00 | 196.06 | FALSE |
| 2023-02-14 14:15:00 | 195.97 | TRUE |
| 2023-02-14 15:15:00 | 195.98 | TRUE |
| 2023-02-15 09:15:00 | 196.23 | FALSE |
| 2023-02-15 10:15:00 | 196.3 | FALSE |
| 2023-02-15 11:15:00 | 196.26 | TRUE |
| 2023-02-15 12:15:00 | 196.4 | TRUE |
| 2023-02-15 13:15:00 | 196.28 | TRUE |
| 2023-02-15 14:15:00 | 197.14 | FALSE |
| 2023-02-15 15:15:00 | 197.08 | FALSE |
| 2023-02-16 09:15:00 | 197.85 | TRUE |
| 2023-02-16 10:15:00 | 198.01 | TRUE |
期望结果数据集
| datetime | number | bool |
|---|---|---|
| 2023-02-14 10:15:00 | 195.35 | FALSE |
| 2023-02-14 14:15:00 | 195.97 | TRUE |
| 2023-02-15 09:15:00 | 196.23 | FALSE |
| 2023-02-15 11:15:00 | 196.26 | TRUE |
| 2023-02-15 14:15:00 | 197.14 | FALSE |
| 2023-02-16 09:15:00 | 197.85 | TRUE |
我试过Pandas的drop_duplicates方法,但它会对整个bool列全局去重,只得到2行数据。不想用循环逐行对比,求Pandas原生解决方案。
解决方案
可以利用Pandas的shift()方法对比当前行与前一行的bool值,筛选出值发生变化的行,同时保留第一行(因为第一行没有前一行):
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'datetime': ['2023-02-14 10:15:00', '2023-02-14 11:15:00', '2023-02-14 12:15:00', '2023-02-14 13:15:00', '2023-02-14 14:15:00', '2023-02-14 15:15:00', '2023-02-15 09:15:00', '2023-02-15 10:15:00', '2023-02-15 11:15:00', '2023-02-15 12:15:00', '2023-02-15 13:15:00', '2023-02-15 14:15:00', '2023-02-15 15:15:00', '2023-02-16 09:15:00', '2023-02-16 10:15:00'], 'number': [195.35, 195.8, 195.87, 196.06, 195.97, 195.98, 196.23, 196.3, 196.26, 196.4, 196.28, 197.14, 197.08, 197.85, 198.01], 'bool': [False, False, False, False, True, True, False, False, True, True, True, False, False, True, True] }) # 生成筛选掩码:当前行bool值与前一行不同,或为第一行 mask = df['bool'] != df['bool'].shift(1) result = df[mask] print(result)
也可以用ne()方法简化写法,效果完全一致:
mask = df['bool'].ne(df['bool'].shift()) result = df[mask]
这种方法是Pandas原生的向量化操作,无需循环,处理效率远高于逐行对比。
内容的提问来源于stack exchange,提问作者Santosh H
相关产品推荐
相关产品推荐

