2014-09-10 155 views
4

这是关于使用列表过滤熊猫数据框的一般问题。问题如下:使用熊猫中的列表删除数据框中的行

  • 我有一个熊猫数据帧df与列field
  • 我已经禁止字段列表,例如ban_field=['field1','field2','field3']
  • ban_field所有元素出现在df.field

目前,为了检索没有被禁止的字段的数据帧,我按如下进行:

for f in ban_field: 
    df = df[df.field!=f] 

是否有更进一步pythonic方式进行(在一行?)?

回答

8

方法#1:使用isin和一个布尔阵列选择器:

In [47]: df = pd.DataFrame({"a": [2]*10, "field": range(10)}) 

In [48]: ban_field = [3,4,6,7,8] 

In [49]: df[~df.field.isin(ban_field)] 
Out[49]: 
    a field 
0 2  0 
1 2  1 
2 2  2 
5 2  5 
9 2  9 

[5 rows x 2 columns] 

方法#2:使用query

In [51]: df.query("field not in @ban_field") 
Out[51]: 
    a field 
0 2  0 
1 2  1 
2 2  2 
5 2  5 
9 2  9 

[5 rows x 2 columns] 
1

可以通过使用isin函数和否定取出( ~)运营商。

df[~df.field.isin(ban_field)] 
相关问题