对来自 df pandas 的 select 行使用系列

use series to select rows from df pandas

接此话题:

我想根据存储在 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' 为 False。

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

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

由于您只有 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

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

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