如何基于特定行组合对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
相关产品推荐
相关产品推荐

