如何在Pandas中移除与前一行value值相同的连续重复行?
问题描述
我有如下Pandas DataFrame:
| date | value |
|---|---|
| 2023-01 | 0 |
| 2023-02 | 0 |
| 2023-03 | -1 |
| 2023-04 | -1 |
| 2023-05 | 0 |
| 2023-06 | 0 |
| 2023-07 | -1 |
| 2023-08 | -1 |
需要移除与前一行value值相同的行,仅保留每组连续相同value的第一行,转换后结果如下:
| date | value |
|---|---|
| 2023-01 | 0 |
| 2023-03 | -1 |
| 2023-05 | 0 |
| 2023-07 | -1 |
解决方案
可以通过Pandas的shift()或diff()方法实现需求,核心思路是对比当前行与前一行的value值,筛选出值发生变化的行(包含第一行)。
方法一:使用shift()
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'date': ['2023-01', '2023-02', '2023-03', '2023-04', '2023-05', '2023-06', '2023-07', '2023-08'], 'value': [0, 0, -1, -1, 0, 0, -1, -1] }) # 筛选连续不同value的行 filtered_df = df[df['value'] != df['value'].shift()] print(filtered_df)
解释:
df['value'].shift()将value列向下偏移一行,第一行变为NaN- 对比
df['value'] != df['value'].shift()时,第一行因NaN与任何值比较结果为True会被保留;后续仅当当前行value与前一行不同时,该行才会被保留
方法二:使用diff()
filtered_df = df[df['value'].diff().fillna(1) != 0]
解释:
diff()计算当前行与前一行的value差值,第一行差值为NaN- 用
fillna(1)将第一行的NaN替换为1,只要差值不为0,就说明value发生了变化,对应行被保留
内容的提问来源于stack exchange,提问作者p.magalhaes
相关产品推荐
相关产品推荐

