使用系列从df pandas中选择行

时间:2016-01-12 10:11:59

标签: pandas boolean selection series multiple-conditions

继续这个主题:get subsection of df based on multiple conditions

我想基于存储在Series对象中的多个条件来提取给定行。

columns = ['is_net', 'is_pct', 'is_mean', 'is_wgted', 'is_sum']
index = ['a','b','c','d']
data = [['True','True','False','False', 'False'],
       ['True','True','True','False', 'False'],
       ['True','True','False','False', 'True'],
       ['True','True','False','True', 'False']]

df = pd.DataFrame(columns=columns, index=index, data=data)
df

    is_net  is_pct  is_mean is_wgted    is_sum
a   True    True    False   False   False
b   True    True    True    False   False
c   True    True    False   False   True
d   True    True    False   True    False

我的条件:

d={'is_net': 'True', 'is_sum': 'True'}
s=pd.Series(d)

预期产出:

    is_net  is_pct  is_mean is_wgted    is_sum
c   True    True    False   False   True

我失败的尝试:

(df == s).all(axis=1)


a    False
b    False
c    False
d    False
dtype: bool

当满足这两个条件时,不确定为什么'c'为假。

注意,我可以达到这样的预期效果,但我宁愿使用Series方法。

df[(df['is_net']=='True') & (df['is_sum']=='True')]

2 个答案:

答案 0 :(得分:1)

由于您只有2个条件,我们可以sum这些并过滤df:

In [55]:
df[(df == s).sum(axis=1) == 2]
​
Out[55]:
  is_net is_pct is_mean is_wgted is_sum
c   True   True   False    False   True

这是有效的,因为布尔值转换为10 TrueFalse

In [56]:
(df == s).sum(axis=1)
​
Out[56]:
a    1
b    1
c    2
d    1
dtype: int64

答案 1 :(得分:1)

您可以通过为列添加子集来修改您的解决方案:

In [219]: df[(df == s)[['is_net', 'is_sum']].all(axis=1)]
Out[219]:
  is_net is_pct is_mean is_wgted is_sum
c   True   True   False    False   True

或:

In [219]: df[(df == s)[s.index].all(axis=1)]
Out[219]:
  is_net is_pct is_mean is_wgted is_sum
c   True   True   False    False   True