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

如何在Pandas中提取各ID布尔值首次切换的行?

按ID提取Val切换行的Pandas解决办法

问题说明

要处理带datetime索引的Pandas DataFrame,里面包含ID列和布尔值Val列。目标是为每个ID提取两类行:

  1. 每个ID第一次出现的行
  2. 同一ID内,Val值在True和False间切换后的第一行
    最终结果中,同一ID不能出现连续Val值相同的行。之前的代码错误在于未按ID分组,直接全局对比行,导致误判不同ID间的行差异,输出不符合要求。

正确代码

# 替换为你实际的DataFrame名称和列名
# 按ID分组,每组内判断Val是否与前一行不同,同时保留每组第一行
mask = df.groupby('ID')['Val'].apply(lambda x: x.ne(x.shift()) | x.isna())
# 筛选出符合条件的行
result = df[mask]

代码逻辑说明

  • groupby('ID'):将数据按ID拆分为独立小组,确保仅在同一ID内部对比Val值,不会跨ID误判
  • x.ne(x.shift()):检查当前行的Val与组内上一行Val是否不同,不同则代表Val发生切换
  • x.isna():每组第一行向上偏移后结果为NaN,用此条件保留每个ID的首次出现行
  • 通过mask筛选后,即可得到符合要求的目标行

示例验证

使用你提供的输入数据测试:
输入数据:

TS      ID  Val
8:00:12 X   TRUE
8:00:50 X   TRUE
8:01:23 Y   FALSE
8:03:45 X   FALSE
8:05:01 Z   TRUE
8:05:29 Z   TRUE
8:06:13 Z   FALSE
8:07:05 Y   FALSE

运行代码后输出结果与期望完全一致:

TS      ID  Val
8:00:12 X   TRUE
8:01:23 Y   FALSE
8:03:45 X   FALSE
8:05:01 Z   TRUE
8:06:13 Z   FALSE

注意事项

如果你的实际列名不是ID和Val(比如之前代码里的symbol和onRunUp),记得替换为对应列名;datetime索引不影响分组逻辑,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:03:15