如何解决从pd数据帧获得联合概率
我有以下数据框
{'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
谢谢
解决方法
好像您可以使用DataFrame.value_counts(normalize=True)
来实现所需的功能。请注意,DataFrame.value_counts
是pandas
> = 1.1.0的新内容。如果您使用的是旧版本,则可以使用其他方法来达到相同的结果。
首先将您的词典转换为pd.DataFrame
:
df = pd.DataFrame(data)
熊猫版本> = 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
如果您的熊猫早于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"],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.0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。