接收可变长度参数的条件概率函数
python 189
原文标题 :conditinal probabilty function that receieves variable length arguments
我有这个数据框 df :
A B C
0 0 1 0
1 0 1 1
2 0 1 1
3 1 0 1
4 0 0 0
5 1 0 0
6 0 0 0
7 0 0 1
8 1 0 0
9 0 0 0
10 1 0 1
11 1 0 1
12 0 1 1
13 1 0 0
14 1 0 0
15 0 1 0
16 1 1 0
17 0 0 1
18 1 0 1
19 1 0 0
20 1 0 1
21 1 1 0
22 1 1 1
23 1 1 1
24 1 0 0
25 1 1 0
26 0 0 1
27 0 1 1
28 0 1 0
29 1 1 0
30 1 0 1
31 0 1 0
32 0 0 1
33 1 1 1
34 0 1 0
35 1 1 0
36 0 1 0
37 0 0 1
38 0 1 1
39 0 1 1
我得到了联合概率 P(A,B,C) :
grp = df.apply(tuple, axis=1)
PrD=pd.concat([df.groupby(grp).first(),
grp.groupby(grp).count().div(len(df)).rename("Probs")],
axis=1).reset_index(drop=True)
print (PrD)
它输出联合概率 P(A,B,C)
A B C Probs
0 0 0 0 0.075
1 0 0 1 0.125
2 0 1 0 0.150
3 0 1 1 0.150
4 1 0 0 0.150
5 1 0 1 0.150
6 1 1 0 0.125
7 1 1 1 0.075
我正在尝试编写一个函数,它接收 PrD 的列名子集并计算遵循规则 P(A|B)= P(A,B)/P(B) 的条件概率,如果它接收到 3 个变量: P(A|B,C)=P(A,B,C)/P(B,C) 如果它接收到 4 个变量: P(A|B,C,D) =P(A,B,C,D )/P(B,C,D) 等等。例如,如果函数接收到 P(A=0|B=0),则输出应通过(0.075+0.125)/(0.075+0.125+0.150+0.150) = 0.2
计算,其中分子是当 A 和 B = 0 时分母是 B =0 并且如果它接收到一个变量 A=0 例如,它返回 (0.075+0.125+0.150+0.150 ) 仅在 A=0 我尝试过的行loc and query
但它们只接收一个变量而不是多个变量我想要一个函数根据接收到的任何数量的变量进行计算
回复
我来回复-
Code Different 评论
该回答已被采纳!
你在电脑上做数学,这意味着应该做一些不同的事情。
您不需要建立联合概率表等。您可以计算
A = 0
和A and B = 0
有多少行并将两者相除:def prob(df, a, *cols): """Return the probability that all columns in `cols` are 0 given column `a` is 0 """ if len(cols) == 0: return df[a].eq(0).sum() / len(df) else: return df[[a] + list(cols)].eq(0).all(axis=1).sum() / df[list(cols)].eq(0).sum()
用法:
prob(df, "A", "B") # 0.4 prob(df, "A", "B", "C") # 0.15
2年前