如何筛选pandas DataFrame中值为1的列右侧存在0的行
正确实现方案
问题原因
你的代码存在两个核心问题:
shift指定了axis=0,是沿行方向(上下行)移动元素,你需要的是沿列方向(左右列)移动,应该改为axis=1- 你没有把每行的多个布尔判断结果合并为单个布尔值用于索引,需要加
any(axis=1),表示只要该行存在任意一个满足条件的位置就保留
完整可运行代码
import pandas as pd # 构造测试数据 test_df = pd.DataFrame({ '2018-02': [0, 0, 0, 0, 1], '2018-03': [0, 1, 1, 0, 0], '2018-04': [1, 1, 1, 1, 0], '2018-05': [1, 0, 0, 1, 0], '2018-06': [1, 1, 1, 1, 0] }) # 核心筛选逻辑:判断是否存在1右侧紧邻0的情况 match_mask = (test_df == 1) & (test_df.shift(-1, axis=1) == 0) # 按行聚合判断:只要有一个位置满足就保留该行 result_df = test_df[match_mask.any(axis=1)] print(result_df)
输出结果
2018-02 2018-03 2018-04 2018-05 2018-06 1 0 1 1 0 1 2 0 1 1 0 1 4 1 0 0 0 0
和预期的索引1、2、4的行完全一致。
方案说明
该方案为通用实现,不依赖任何列名硬编码,全部使用pandas向量化操作,性能足够处理大规模数据集。
内容的提问来源于stack exchange,提问作者Deke Marquardt
相关产品推荐
相关产品推荐

