如何在Pandas中提取各ID布尔值首次切换的行?
按ID提取Val切换行的Pandas解决办法
问题说明
要处理带datetime索引的Pandas DataFrame,里面包含ID列和布尔值Val列。目标是为每个ID提取两类行:
- 每个ID第一次出现的行
- 同一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
相关产品推荐
相关产品推荐

