Python:根据多个动态列值过滤数据帧行

时间:2017-06-27 09:32:59

标签: python pandas

我正在尝试根据列值列表过滤我的数据帧行。这个问题是,我有动态的列的长度,到目前为止我已经尝试了这个,这不符合我的目的。

>>>df
    a      b
0  jdfb  sdvkb

如果我必须一次搜索两个列。那就是a='jdfb'b='sdvkb'然后我需要返回1。

我创建的搜索列动态存储在列表变量fields中,值也在另一个列表变量'matchlist`中。

fields = ['a','b']
matchlist = ['jdfb','sdvkb']

方法1 我试过这个并且有效:

>>> df[fields].isin(matchlist)
    a     b
0  True  True

这很好。这实际上正是我想要的。但是当我尝试下一个查询时,这不是我想要的,因为它不应该有效:

>>> df[fields].isin(matchlist)
    a     b
0  True  True

这种方法的问题是列应该按照方法1 中指定的顺序匹配,而不是我尝试的下一种方式。有什么方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

生成两个单独的布尔索引并将它们组合起来可能更容易。

>>> import pandas as pd
>>> 
>>> #create the mapping of desirable values
... desirable = ['a','b']
>>> 
>>> #create data where some rows match the conditions
... data = [desirable,desirable[::-1],desirable, desirable, desirable[::-1]]
>>> df = pd.DataFrame(data, columns = ['first','second'])
>>> 
>>> #Rows 0, 2, and 3 match our conditions
... df
  first second
0     a      b
1     b      a
2     a      b
3     a      b
4     b      a
>>> 
>>> #create a boolean mask for rows that match our conditions
... conditions = (df['first'] == desirable[0]) & (df['second'] == desirable[1])
>>> 
>>> #we can now use this boolean mask to get the desired rows
... df[conditions]
  first second
0     a      b
2     a      b
3     a      b
>>>