我有一个这样布置的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()[真]