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

从Pandas DataFrame提取某列连续值发生变化的行

提取Pandas DataFrame中目标列连续值变化的边界行

要提取目标列(如示例中的B列)连续值发生变化时的对应行,核心是找出每组连续相同值的最后一行和下一组的第一行,可以通过以下步骤实现:

1. 构造示例DataFrame

先还原测试数据:

import pandas as pd

data = {
    'sno': [1, 2, 3, 4, 5, 6, 7, 8, 9],
    'A': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'I'],
    'B': ['yes', 'yes', 'No', 'No', 'No', 'yes', 'yes', 'yes', 'No']
}
df = pd.DataFrame(data)

2. 生成筛选掩码

通过shift()方法对比当前行与相邻行的目标列值,生成两个筛选掩码:

  • mask_last:标记当前行与下一行值不同的行(即每组连续相同值的最后一行)
  • mask_first:标记当前行与上一行值不同的行(即每组连续相同值的第一行,除了第一组的首行)
# 筛选每组最后一行
mask_last = df['B'] != df['B'].shift(-1)
# 筛选每组第一行(除首组)
mask_first = df['B'] != df['B'].shift(1)

3. 合并掩码并提取结果

将两个掩码取逻辑或,即可得到所有需要的边界行:

result = df[mask_last | mask_first]
print(result)

输出结果

运行后会得到与示例一致的输出:

sno  A    B
1    2  b  yes
2    3  c   No
4    5  e   No
5    6  f  yes
7    8  h  yes
8    9  I   No

原理说明

  • shift(-1)将目标列向下偏移一行,对比当前行与下一行的值,定位每组的结尾
  • shift(1)将目标列向上偏移一行,对比当前行与上一行的值,定位每组的开头(排除第一组首行)
  • 两个掩码合并后,覆盖了所有连续值变化的边界行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:28:12