list_of_values
不一定要是一个list
;它可以是set
、tuple
、dictionary
、numpy数组、pandas Series、generator、range
等等。而isin()
和query()
仍然可以正常工作。
关于query()
的一点说明:
- 你也可以在
query()
函数内部调用isin()
函数:
list_of_values = [3, 6]
df.query("A.isin(@list_of_values)")
- 你可以通过
local_dict
参数传递要搜索的值,这在你不想事先创建过滤列表的函数调用链中非常有用:
df.query("A == @lst", local_dict={'lst': [3, 6]})
选择行时的一些常见问题
1. list_of_values
是一个范围
如果您需要在范围内进行筛选,您可以使用 between()
方法或 query()
。
list_of_values = [3, 4, 5, 6]
df[df['A'].between(3, 6)]
df.query('3<=A<=6')
2. 按照 list_of_values
的顺序返回 df
在原始问题中,list_of_values
中的数值在 df
中的顺序并不相同。如果你希望 df
按照 list_of_values
中的顺序返回,即通过 list_of_values
进行排序,可以使用 loc
。
list_of_values = [3, 6]
df.set_index('A').loc[list_of_values].reset_index()
如果你想保留旧索引,可以使用以下方法。
list_of_values = [3, 6, 3]
df.reset_index().set_index('A').loc[list_of_values].reset_index().set_index('index').rename_axis(None)
3. 不要使用 apply
一般来说,isin()
和 query()
是完成这个任务的最佳方法;不需要使用 apply()
。例如,对于函数 f(A) = 2*A - 5
在列 A
上,isin()
和 query()
都能更高效地工作:
df[(2*df['A']-5).isin(list_of_values)]
df[df['A'].mul(2).sub(5).isin(list_of_values)]
df.query("A.mul(2).sub(5) in @list_of_values")
4. 选择不在
list_of_values
中的行
要选择不在
list_of_values
中的行,请使用
isin()
/
in
的否定形式:
df[~df['A'].isin(list_of_values)]
df.query("A not in @list_of_values")
5. 选择多列中包含
list_of_values
的行
如果您想要使用两个(或多个)列进行筛选,可以使用
any()
和
all()
来根据需要减少列数(
axis=1
)。
选择至少有一个
A
或
B
在
list_of_values
中的行:
df[df[['A','B']].isin(list_of_values).any(1)]
df.query("A in @list_of_values or B in @list_of_values")
选择
A
和
B
都在
list_of_values
中的行:
df[df[['A','B']].isin(list_of_values).all(1)]
df.query("A in @list_of_values and B in @list_of_values")