我有以下数据帧
{'state': {7192: 'healthy',
7193: 'healthy',
7194: 'healthy',
7195: 'Non healthy',
7196: 'Non healthy'},
'type': {7192: 'W', 7193: 'A', 7194: 'W', 7195: 'W', 7196: 'A'}}我希望有与此df相关的联合概率。
P(状态=健康,类型= A),P(状态=健康,类型= W),P(状态=不健康,类型= A),P(状态=不健康,类型= W)
我尝试了groupby方法,但它不起作用。做这件事最有效的方法是什么?
编辑:为了澄清一点,我想计算每对情侣(状态,类型)的出现次数。在上面的示例中,这应该是P(状态=健康,类型= A) = 1/5,P(状态=健康,类型= W) = 2/5 P(状态=不健康,类型= A) = 1/5,P(状态=不健康,类型= W) = 1/5
谢谢,
发布于 2020-11-03 05:40:33
似乎您可以使用DataFrame.value_counts(normalize=True)来实现您想要的功能。请注意,DataFrame.value_counts是pandas >= 1.1.0中的新功能。如果您使用的是较旧的版本,则可以使用不同的方法获得相同的结果。
首先将您的字典转换为pd.DataFrame
df = pd.DataFrame(data)Pandas版本>= 1.1.0
probs = df.value_counts(["state", "type"], normalize=True)
print(probs)
healthy W 0.4
A 0.2
Non healthy W 0.2
A 0.2
# Select individual probabilitiy:
healthy_a_prob = probs[("healthy", "A")]
print(healthy_a_prob)
0.2如果您的pandas早于1.1.0,请将上面示例中的第一行替换为:
probs = df.groupby("state")["type"].value_counts() / len(df)
# rest is the exact same如果您想要一个交叉表的概率表,我建议您结合使用pd.crosstab和normalize=True
crosstab_ptable = pd.crosstab(df["state"], df["type"], normalize=True)
print(crosstab_ptable)
type A W
state
Non healthy 0.2 0.2
healthy 0.2 0.4如果你也对边际概率感兴趣,你可以使用margins参数:
crosstab_ptable = pd.crosstab(df["state"], df["type"], margins=True, normalize=True)
print(crosstab_ptable)
type A W All
state
Non healthy 0.2 0.2 0.4
healthy 0.2 0.4 0.6
All 0.4 0.6 1.0https://stackoverflow.com/questions/64652945
复制相似问题