如何用Pandas的groupby筛选含EQ、AI且不含BO的NAME?
Pandas筛选符合条件的NAME分组数据
原始数据
首先,我们有如下的DataFrame:
import pandas as pd df = pd.DataFrame({"NAME":["A", "A", "A" ,"A", "B", "B", "B", "C", "C", "C", "C", "D", "D",], "CLASS":["LI","BO","EQ","AI", "LI", "EQ", "AI", "LI","BO","EQ","AI", "EQ", "AI", ]})
需求
筛选出**同时包含EQ和AI但不包含BO**的NAME对应的所有行。
实现方法
可以通过groupby结合filter函数实现,核心是对每个NAME分组进行条件校验:
方法一:自定义筛选函数
def validate_group(group): class_set = set(group['CLASS']) # 校验:同时包含EQ、AI,且不含BO return {'EQ', 'AI'}.issubset(class_set) and 'BO' not in class_set # 应用筛选,返回符合条件的所有行 filtered_df = df.groupby('NAME').filter(validate_group) print(filtered_df)
方法二:简洁的lambda表达式写法
如果追求代码简洁,也可以直接用lambda表达式替代自定义函数:
filtered_df = df.groupby('NAME').filter( lambda g: {'EQ', 'AI'}.issubset(g['CLASS']) and 'BO' not in g['CLASS'] )
输出结果
执行上述代码后,将得到符合要求的结果:
NAME CLASS 4 B LI 5 B EQ 6 B AI 10 D EQ 11 D AI
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

