寻找某种方法通过几个标准过滤我的数据框(例如数据帧:
id Arrest Shift_num Description
0 True 20 Weapon
1 False 25 unarmed
2 True 30 Weapon
我想通过以下方式获得DF: 描述 == 武器和shift_num >= 25
和arrest == 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