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

如何基于特定行组合对Pandas DataFrame进行行切片?

解决方案:筛选目标行组合并去除连续重复项

看起来你需要的是从DataFrame中筛选出属于特定行组合的记录,同时去掉连续重复的同一组合行,只保留交替出现的目标行。下面是具体的实现步骤:

1. 先定义测试数据(方便复现)

首先我们先把你的原始DataFrame还原出来:

import pandas as pd

data = {
    'A': [0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0],
    'B': [1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1]
}
df = pd.DataFrame(data)

2. 核心实现步骤

我们的目标是:先筛选出所有属于{(1,0), (0,1)}的行,再去掉其中连续重复的同一组合行。

# 定义目标行组合(用集合来提高匹配效率)
target_combinations = {(1, 0), (0, 1)}

# 第一步:筛选出所有属于目标组合的行
# 把每行转成(A,B)元组,再判断是否在目标集合中
mask = df.apply(tuple, axis=1).isin(target_combinations)
filtered_df = df[mask].copy()

# 第二步:去掉连续重复的同一组合行
# 比较当前行和前一行的元组是否相同,保留不同的行(包括第一行)
filtered_df['is_duplicate_with_prev'] = (
    filtered_df.apply(tuple, axis=1) == filtered_df.apply(tuple, axis=1).shift()
)
result_df = filtered_df[~filtered_df['is_duplicate_with_prev']].drop(columns='is_duplicate_with_prev')

3. 查看结果

运行上面的代码后,result_df就是你想要的输出:

A  B
2   1  0
6   0  1
8   1  0
10  0  1

简化写法(不用额外列)

如果你不想创建中间列,可以把逻辑合并成一行:

target_combinations = {(1, 0), (0, 1)}
# 先筛选目标行,再过滤连续重复项
result_df = df[df.apply(tuple, axis=1).isin(target_combinations)]
result_df = result_df[result_df.apply(tuple, axis=1) != result_df.apply(tuple, axis=1).shift()]

为什么你的之前方法没生效?

多层索引切片更适合处理层级化的索引结构,而你的需求是基于行内容的筛选+去重;行差方法通常用来求两个DataFrame的差异,也不匹配当前的场景。我们这里的思路是先缩小范围到目标行,再去除连续重复的同一组合,正好匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:19:03