如何在Pandas groupby中筛选同时满足多个pos要求的lemma值
方案1:最简实现(适合中小数据量)
直接按lemma分组后判断每组的pos是否同时包含两种目标标签即可,一行代码就能完成:
target_lemmas = df.groupby('lemma').filter(lambda x: {'VERB', 'NOUN'}.issubset(x['pos']))['lemma'].unique().tolist()
运行后得到的结果就是['walk'],完全符合需求。
方案2:高性能实现(适合百万级以上大数据量)
避开apply的函数调用开销,全程用pandas原生向量化操作,性能提升非常明显:
# 1. 先过滤出只需要的pos类型,再去重相同lemma和pos的条目 tmp = df[df['pos'].isin(['VERB', 'NOUN'])].drop_duplicates(['lemma', 'pos']) # 2. 统计每个lemma对应的不同pos数量,数量为2就说明同时具备两种标签 target_lemmas = tmp.groupby('lemma').size()[lambda x: x == 2].index.tolist()
原方案效率低的原因
之前的实现需要两次遍历groupby对象,还要额外做集合交集运算,迭代和集合操作的开销都会随数据量增长快速升高,上述两个方案都只需要一次分组操作,性能好很多。
内容的提问来源于stack exchange,提问作者Alexander Tono
相关产品推荐
相关产品推荐

