继续这个主题: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')]
答案 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
这是有效的,因为布尔值转换为1
和0
True
和False
:
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