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

如何筛选DataFrame中符合z列特定配对模式的行

问题描述

我有如下结构的DataFrame:

xyz
2311
2342
23561
23592
15891
15121
15152
17181
17212
78111
78381
78412

需要筛选出同一x值下,z列满足**"1后跟2"**配对的所有数据——也就是移除所有z=1但下一行z≠2的行,最终期望输出:

xyz
2311
2342
23561
23592
15121
15152
17181
17212
78381
78412
解决方案

可以通过按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)

代码说明

  1. 分组获取下一行z值:用groupby('x')限定只在同一x的组内查看后续行,shift(-1)把下一行的z值提取到当前行的next_z列;
  2. 筛选配对行:
    • 第一部分规则:保留所有z=1且下一行是z=2的起始行;
    • 第二部分规则:保留所有z=2且上一行是z=1的配对行,确保完整保留每组的1-2配对;
  3. 清理结果:用筛选规则过滤后,删除临时生成的next_z列,得到最终目标数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:15:25