我有一个这样布置的DataFrame data

Observation     A_1    A_2    A_3    B_1    B_2    B_3
Obs1            yes    no     yes    no     no     no
Obs2            no     no     no     yes    yes    yes
Obs3            yes    yes    yes    yes    yes    yes


目标:计算所有标记为“是”的观测值的频率,这些观测值是:


仅在“ A”样本中
仅在“ B”样本中
两组


编辑:这意味着对于前两个计数,我需要排除A和B组都包含“是”的观测值(请参阅第三行)。

我考虑过使用groupby

grouper = data.groupby(lambda x: x.split("_")[0], axis=1)
grouped = grouper.agg(lambda x: sum(x == "yes"))


但是我有按行划分的计数,这不是我想要的。

最好的行动理由是什么?

编辑:根据要求,有关输出的更多信息。我想要类似的东西

Frequency of valid [meaning "yes"] observations in group A: X
Frequency of valid observations in group "B": Y
Frequency for all valid observations: Z


X,Y和Z是返回的计数。

对于个别观察,我不关心此特定输出。我对所有这些价值观都感兴趣。

最佳答案

In [129]: a = ['A_1', 'A_2', 'A_3']

In [130]: b = ['B_1', 'B_2', 'B_3']

In [131]: ina = (df[a] == 'yes').any(axis=1)

In [132]: inb = (df[b] == 'yes').any(axis=1)

In [133]: ina & ~inb
Out[133]:
Observation
Obs1            True
Obs2           False
Obs3           False
dtype: bool

In [134]: ~ina & inb
Out[134]:
Observation
Obs1           False
Obs2            True
Obs3           False
dtype: bool

In [135]: ina & inb
Out[135]:
Observation
Obs1           False
Obs2           False
Obs3            True
dtype: bool


可以使用value_counts进行计数:(ina和inb).value_counts()[真]

08-24 21:37