如何筛选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
相关产品推荐
相关产品推荐

