2014-09-10 106 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)]