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"] ]
- 索引对齐问题:
df[::2]["id"]的行索引是0、2、4、6、8,df[1::2]["id"]的行索引是1、3、5、7、9,两个Series做相等判断时pandas会按索引匹配对应值,所有位置都找不到匹配的索引,比较结果全为False,无法筛选出有效行。 - 列名匹配问题:如果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
相关产品推荐
相关产品推荐

