有没有办法在Python中对数据帧进行多重筛选?

有没有办法在Python中对数据帧进行多重筛选?,python,pandas,Python,Pandas,正在寻找一些方法,通过几个标准过滤我的数据帧(例如,数据帧: id Arrest Shift_num Description 0 True 20 Weapon 1 False 25 unarmed 2 True 30 Weapon 我想通过以下方式获得DF: Description==武器和shift_num>=25和逮捕==True(例如) 经过几次尝试,这是我的方式,但我认为它可以比这更好: arrest=

正在寻找一些方法,通过几个标准过滤我的数据帧(例如,数据帧:

id  Arrest  Shift_num  Description
0   True    20         Weapon
1   False   25         unarmed
2   True    30         Weapon 
我想通过以下方式获得DF: Description==武器和
shift_num>=25
逮捕==True
(例如)

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

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

print(df[arrest & shift & weap])
提前感谢:)

您可以尝试切片:

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)]
您可以使用(额外的好处:它使用了非常优化的
numexpr
):

输出:

   Arrest  Shift_num Description
2    True         30      Weapon
一些注意事项:

  • 不要忘记“引用”字符串
  • 可以使用的变量名来自数据帧范围(无需使用
    df
    作为前缀)
  • 如果不想被捕,请使用
    ~逮捕
  • 您可以使用
    @
    引用范围中的变量(即不在df中)

我鼓励你阅读。

你的作品。这是一个单班轮,可能会稍微更有效。由于
逮捕
是一个布尔字段,因此可以直接对其求值,而不是使用
==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

df[df['restart'].eq(True)&df['Shift_num'].ge(25)&df['Description'].eq(武器)]
我觉得你的解决方案不错。你的解决方案通常是在熊猫中完成的。一次应用所有三个掩码可能比将每个掩码存储为变量要好一些。请参阅文档中的布尔索引:太棒了,非常感谢:))谢谢it@MaxBoyar不客气!如果答案解决了你的问题,请随意接受。谢谢,为我工作,谢谢:)
In [5]: df[(df.Description == 'Weapon') & (df.Shift_num >= 25) & (df.Arrest)] 
Out[5]: 
   id  Arrest  Shift_num Description
2   2    True         30      Weapon