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

Pandas DataFrame奇偶行配对比较 筛选保留id相同的成对行

问题场景

现有一个包含Index、Time、Id三列的DataFrame,共10行样例数据:

  • 索引0:Time为10:10:00、Id为11
  • 索引1:Time为10:10:01、Id为12
  • 索引2:Time为10:10:02、Id为12
  • 索引3:Time为10:10:04、Id为12
  • 索引4:Time为10:10:06、Id为13
  • 索引5:Time为10:10:07、Id为13
  • 索引6:Time为10:10:08、Id为11
  • 索引7:Time为10:10:10、Id为11
  • 索引8:Time为10:10:12、Id为11
  • 索引9:Time为10:10:14、Id为13

需求说明

按相邻奇偶行配对:行0与行1、行2与行3……所有偶数索引行和紧接的下一个奇数索引行为一组,仅保留组内两个行Id值完全相同的配对行,预期最终保留索引2&3、4&5、6&7共三组6行数据。

原有代码问题

之前编写的筛选代码无法得到正确结果,核心原因有两点:

df = df[
    df[::2]["id"] ==df[1::2]["id"]
]
  1. 索引对齐问题:df[::2]["id"]的行索引是0、2、4、6、8,df[1::2]["id"]的行索引是1、3、5、7、9,两个Series做相等判断时pandas会按索引匹配对应值,所有位置都找不到匹配的索引,比较结果全为False,无法筛选出有效行。
  2. 列名匹配问题:如果DataFrame列名是大写开头的Id,代码里写小写id会直接触发键报错。

正确实现方案

方案1:分组判断(可读性好)

给每一组相邻奇偶行分配同一个分组ID,判断每个分组内的Id是否全部一致,再筛选符合条件的行:

import numpy as np

# 按相邻两行分配同一个分组编号
pair_group = np.arange(len(df)) // 2
# 标记每个分组内Id是否全部相同
keep_mask = df.groupby(pair_group)["Id"].transform(lambda x: x.nunique() == 1)
# 得到最终筛选结果
result = df[keep_mask]

方案2:数组直接比较(执行效率高)

取奇偶行的Id值转成numpy数组(跳过pandas索引对齐逻辑),按位置比较配对是否相等,再把比较结果重复两次对应组内两行,生成完整筛选掩码:

# 按位置比较每对Id是否相等,每个结果重复2次覆盖组内两个行
keep_mask = (df["Id"].iloc[::2].to_numpy() == df["Id"].iloc[1::2].to_numpy()).repeat(2)
result = df[keep_mask]

两种方案运行后都会得到预期的三组配对数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:36:18