如何在从 Pandas 数据框中选择的列表中检查值是否存在?

110

看起来很丑:

df_cut = df_new[
             (
             (df_new['l_ext']==31) |
             (df_new['l_ext']==22) |
             (df_new['l_ext']==30) |
             (df_new['l_ext']==25) |
             (df_new['l_ext']==64)
             )
            ]

无法工作:

df_cut = df_new[(df_new['l_ext'] in [31, 22, 30, 25, 64])]

有没有一个优雅且有效的解决上述“问题”的解决方案?

2个回答

245

使用isin

df_new[df_new['l_ext'].isin([31, 22, 30, 25, 64])]

28
这是 pandas 语法中不太直观的特性之一... 除非你知道,否则你不会知道。 - openwonk
4
isin的反义词是not in。我正在寻找一种过滤列表元素的方法。 - Augmented Jacob
1
numpy.logical_not(foo.isin(x))和Pandas作者建议的另一种方法:https://dev59.com/3WYq5IYBdhLWcg3w-FPP - Luke Barker
9
使用进行否定应该足以实现不在isin中的操作。df_new[df_new['l_ext'].isin([31, 22, 30, 25, 64])] - Arun Das
1
请注意,如果列的类型不明确,例如“object”,它既可以是数字也可以是字符串,“isin”将自动推断数据类型。 - Semooze
如果我需要检查一列中的值是否是一组集合中的子集,该怎么办?例如,给定的定义值列表是[{a, b}, {c, d}, {e, f}],其中a, b, c...是一些值(比如字符串)。谢谢。 - undefined

15
你可以使用pd.DataFrame.query:
select_values = [31, 22, 30, 25, 64]
df_cut = df_new.query('l_ext in @select_values')

在背景中,这使用顶级pd.eval函数。


1
另一种不需要创建额外变量的替代方法: df_new.query('l_ext.isin([31, 22, 30, 25, 64]).values') - rachwa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接