2014-02-11 74 views
1

我有一个数据框如下;熊猫:应用多个过滤器

 WORD1 CAT1   WORD2 CAT2  Val 1 Val 2 Val 3 
    elephant animal   daisy flower 191 138 129 
     lion animal  blackbird flower 171 169 213 
     tiger animal   chimp animal 229 179 482 
     hoopoe bird   cheetah animal 169 104 202 
    hornbill bird   cuckoo  bird 483 469  78 
    sunflower flower   robin  bird 470 442 160 
     rose flower  leopard animal 219 244 432 
    giraffe animal   violet flower 445 497 420 
     zebra animal   deer animal 280  74 383 
    sparrow bird chrysanthemum flower 280 242 434 
     duck animal   hawk  bird 321  90  87 

我想申请基于从“CAT1” &“CAT2”下面的模式过滤器;

['animal',['flower','bird']] - 将被读作;

CAT1  CAT2 
animal & flower 
animal & bird 
flower & animal 
bird & animal 

过滤器应在这样一种方式,“花&鸟”或“鸟&花”被排除来施加。

上述关系的过滤结果应该是;

WORD1  CAT1  WORD2  CAT2  Val 1 Val 2 Val 3 
elephant animal daisy  flower 191  138  129 
duck  animal hawk  bird  321  90  87 
rose  flower leopard animal 219  244  432 
hoopoe  bird  cheetah animal 169  104  202 
lion  animal blackbird flower 171  169  213 
giraffe  animal violet flower 445  497  420 

如何建立一个过滤器来做到这一点?

我试过以下没有任何成功。

>>> data = data[((data['CAT1'] != 'flower') & (data['CAT2'] != 'bird')) & ((data 
['CAT1'] != 'bird') & (data['CAT2'] != 'flower'))] 

回答

1

这工作?这不是特别优雅,但它应该完成这项工作。除了您的列表,我还抓到了liongiraffe,但他们似乎符合条件,除非我误解了。

myset = ['flower', 'bird'] 
df[((df.CAT1 == 'animal') & (df.CAT2.isin(myset))) | ((df.CAT2 == 'animal') & (df.CAT1.isin(myset)))] 

 WORD1 CAT1 WORD2  CAT2 Val1 Val2 Val3 
0 elephant animal daisy  flower 191  138  129 
1 lion  animal blackbird flower 171  169  213 
3 hoopoe bird cheetah animal 169  104  202 
6 rose  flower leopard animal 219  244  432 
7 giraffe animal violet flower 445  497  420 
10 duck  animal hawk  bird  321  90 87 
+0

是的,我已经包括在编辑 '狮子' 和 '长颈鹿'。凉!适用于我。 – richie