有没有办法在Python-Pandas中多个过滤器数据帧?



寻找某种方法通过几个标准过滤我的数据框(例如数据帧:

id  Arrest  Shift_num  Description
0   True    20         Weapon
1   False   25         unarmed
2   True    30         Weapon 

我想通过以下方式获得DF: 描述 == 武器和shift_num >= 25arrest == True(例如(

经过几次尝试,这就是我的方式,但我认为它可以比这更好:

arrest=(df.Arrest == True)
shift=(df.Shift_num >= 25)
weap= (df['Description'] == 'weapon')
print(df[arrest & shift & weap])

提前致谢:)

你可以使用df.query(一个好处:它使用了非常优化的numexpr

import pandas as pd
df = pd.DataFrame({"Arrest": [True, False, True], 
"Shift_num": [20, 25, 30], 
"Description": ["Weapon", "unarmed", "Weapon"]})
df.query("Arrest & Shift_num >= 25 & Description == 'Weapon'")

输出:

Arrest  Shift_num Description
2    True         30      Weapon

一些注意事项:

  • 不要忘记"引用"字符串
  • 可以使用的变量名称来自数据帧范围(无需使用df作为前缀(
  • 当您
  • 不想被捕时使用~Arrest
  • 您可以使用@来引用作用域中的变量(即不在 df 中(

我鼓励你阅读有关numexpr的信息。

您可以尝试切片:

df = pd.DataFrame({'Arrest':[True,False,True],'Shift_num':[20,25,30],'Description':['Weapon','unarmed','Weapon']})
df.loc[(df['Description'] == 'Weapon') & (df['Shift_num'] > 25) & (df['Arrest'] == True)]

你所拥有的是有效的。这是一个可能效率稍高的衬里。由于Arrest是一个布尔字段,因此您可以直接对其进行计算,而不是使用== True

In [5]: df[(df.Description == 'Weapon') & (df.Shift_num >= 25) & (df.Arrest)] 
Out[5]: 
id  Arrest  Shift_num Description
2   2    True         30      Weapon

最新更新