如何筛选DataFrame中符合z列特定配对模式的行
问题描述
我有如下结构的DataFrame:
| x | y | z |
|---|---|---|
| 23 | 1 | 1 |
| 23 | 4 | 2 |
| 23 | 56 | 1 |
| 23 | 59 | 2 |
| 15 | 89 | 1 |
| 15 | 12 | 1 |
| 15 | 15 | 2 |
| 17 | 18 | 1 |
| 17 | 21 | 2 |
| 78 | 11 | 1 |
| 78 | 38 | 1 |
| 78 | 41 | 2 |
需要筛选出同一x值下,z列满足**"1后跟2"**配对的所有数据——也就是移除所有z=1但下一行z≠2的行,最终期望输出:
| x | y | z |
|---|---|---|
| 23 | 1 | 1 |
| 23 | 4 | 2 |
| 23 | 56 | 1 |
| 23 | 59 | 2 |
| 15 | 12 | 1 |
| 15 | 15 | 2 |
| 17 | 18 | 1 |
| 17 | 21 | 2 |
| 78 | 38 | 1 |
| 78 | 41 | 2 |
解决方案
可以通过按x分组,结合shift()函数标记符合条件的行,再筛选保留:
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'x': [23,23,23,23,15,15,15,17,17,78,78,78], 'y': [1,4,56,59,89,12,15,18,21,11,38,41], 'z': [1,2,1,2,1,1,2,1,2,1,1,2] }) # 按x分组,计算每组内当前行的下一行z值 df['next_z'] = df.groupby('x')['z'].shift(-1) # 构建筛选规则:保留z=1且下一行是z=2的行,以及z=2且上一行是z=1的行 mask = ((df['z'] == 1) & (df['next_z'] == 2)) | ((df['z'] == 2) & (df['z'].shift() == 1)) # 应用筛选并删除辅助列 result = df[mask].drop('next_z', axis=1) print(result)
代码说明
- 分组获取下一行z值:用
groupby('x')限定只在同一x的组内查看后续行,shift(-1)把下一行的z值提取到当前行的next_z列; - 筛选配对行:
- 第一部分规则:保留所有
z=1且下一行是z=2的起始行; - 第二部分规则:保留所有
z=2且上一行是z=1的配对行,确保完整保留每组的1-2配对;
- 第一部分规则:保留所有
- 清理结果:用筛选规则过滤后,删除临时生成的
next_z列,得到最终目标数据。
内容的提问来源于stack exchange,提问作者Ali Inayat
相关产品推荐
相关产品推荐

