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

如何筛选Pandas DataFrame中分组后accept列全为True的行

筛选DataFrame中所有accept列全为True的ids对应的行

问题背景

现有如下数据及生成的DataFrame:

data = [
    [1, True],
    [1, True],
    [1, True],
    [1, True],
    [2, True],
    [2, False],
    [2, True],
    [3, True],
    [3, True],
    [3, True],
    [3, True],
    [4, True],
    [4, True],
    [4, False],
    [5, True],
    [5, True],
    [5, True],    
    [5, True],
]

import pandas as pd
df = pd.DataFrame(data, columns=['ids', 'accept'])

需求是过滤掉所有accept列存在至少一个False值的ids对应的行,最终结果要排除ids为2和4的所有行。目前已经通过分组和all()方法得到了各ids对应的accept是否全为True的结果:

grouped = df.groupby('ids')
accept_all_true = grouped['accept'].all()

解决方案

方法1:基于已生成的结果筛选

从accept_all_true中提取出所有值为True的ids,再用isin()匹配原DataFrame的ids列即可:

# 提取符合条件的ids(accept全为True的ids)
valid_ids = accept_all_true[accept_all_true].index
# 筛选原DataFrame
filtered_df = df[df['ids'].isin(valid_ids)]

方法2:链式写法更简洁

直接用transform()方法将分组后的结果广播到每一行,一步完成筛选,无需单独存储中间结果:

filtered_df = df[df.groupby('ids')['accept'].transform('all')]

transform('all')会为原DataFrame的每一行生成对应分组的accept列是否全为True的布尔值,直接用这个布尔序列筛选即可得到目标结果。

验证结果

执行后,filtered_df['ids'].unique()会输出array([1, 3, 5]),符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:20:24