我正在尝试根据列值列表过滤我的数据帧行。这个问题是,我有动态的列的长度,到目前为止我已经尝试了这个,这不符合我的目的。
>>>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 中指定的顺序匹配,而不是我尝试的下一种方式。有什么方法可以实现这个目标吗?
答案 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
>>>