List_of_values不一定是一个列表;它可以被设置,tuple, dictionary, numpy array, pandas Series, generator, range等,isin()和query()仍然有效。
选择行时的一些常见问题
1. List_of_values是一个范围
如果需要在一个范围内进行过滤,可以使用between()方法或query()。
list_of_values = [3, 4, 5, 6] # a range of values
df[df['A'].between(3, 6)] # or
df.query('3<=A<=6')
2. 按list_of_values的顺序返回df
在OP中,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()。例如,对于列A上的函数f(A) = 2*A - 5, isin()和query()都能更有效地工作:
df[(2*df['A']-5).isin(list_of_values)] # or
df[df['A'].mul(2).sub(5).isin(list_of_values)] # or
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") # df.query("A != @list_of_values")
5. 选择list_of_values中有多列的行
如果您希望使用两个(或多个)列进行过滤,则可以使用any()和all()来减少列(axis=1),这取决于需要。
在list_of_values中选择A或B中至少有一个的行:
df [df [[A, B]] .isin (list_of_values) .any (1)]
df。查询("A in @list_of_values or B in @list_of_values")
在list_of_values中选择A和B都在的行:
df [df [[A, B]] .isin (list_of_values)所有(1)]
df。查询("A in @list_of_values and B in @list_of_values")
奖金:
你也可以在query()中调用isin():
df.query("A.isin(@list_of_values).values")