从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
相关产品推荐
相关产品推荐

