我有兩個「a」和「b」列的DataFrame。如何找到給定具體「b」的條件概率「a」?熊貓 - 給定具體b的條件概率
df.groupby('a').groupby('b')
不起作用。讓我們假設我有三個類別在a欄中,對於每個具體的我有5個類別的b。我需要做的是找出a的每個類的b類的總數。我試過應用命令,但我想我不知道如何正確使用它。
df.groupby('a').apply(lambda x: x[x['b']] == '...').count()
我有兩個「a」和「b」列的DataFrame。如何找到給定具體「b」的條件概率「a」?熊貓 - 給定具體b的條件概率
df.groupby('a').groupby('b')
不起作用。讓我們假設我有三個類別在a欄中,對於每個具體的我有5個類別的b。我需要做的是找出a的每個類的b類的總數。我試過應用命令,但我想我不知道如何正確使用它。
df.groupby('a').apply(lambda x: x[x['b']] == '...').count()
要找到b
類總數爲類的每個實例a
你會做
df.groupby('a').b.value_counts()
例如,創建一個DataFrame,如下所示:
df = pd.DataFrame({'A':['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'], 'B':['one', 'one', 'two', 'three','two', 'two', 'one', 'three'], 'C':np.random.randn(8), 'D':np.random.randn(8)})
A B C D
0 foo one -1.565185 -0.465763
1 bar one 2.499516 -0.941229
2 foo two -0.091160 0.689009
3 bar three 1.358780 -0.062026
4 foo two -0.800881 -0.341930
5 bar two -0.236498 0.198686
6 foo one -0.590498 0.281307
7 foo three -1.423079 0.424715
然後:
df.groupby( 'A')[ 'B'] value_counts()
A
bar one 1
two 1
three 1
foo one 2
two 2
three 1
向該轉換爲條件概率,則需要的總大小來劃分每組。
你可以做到這一點與其他GROUPBY:
df.groupby('A')['B'].value_counts()/df.groupby('A')['B'].count()
A
bar one 0.333333
two 0.333333
three 0.333333
foo one 0.400000
two 0.400000
three 0.200000
dtype: float64
或者你可以申請一個lambda
功能到組:
df.groupby('a').b.apply(lambda g: g.value_counts()/len(g))
您可以在列表中傳遞給GROUPBY:
df.groupby(['a','b']).count()
你可以試試這個功能,
def conprob(pd1,pd2,transpose=1):
if transpose==0:
table=pd.crosstab(pd1,pd2)
else:
table=pd.crosstab(pd2,pd1)
cnames=table.columns.values
weights=1/table[cnames].sum()
out=table*weights
pc=table[cnames].sum()/table[cnames].sum().sum()
table=table.transpose()
cnames=table.columns.values
p=table[cnames].sum()/table[cnames].sum().sum()
out['p']=p
return out
這個返回條件概率P(行|列)
考慮到Maxymoo建議數據框:
df = pd.DataFrame({'A':['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'], 'B':['one', 'one', 'two', 'three','two', 'two', 'one', 'three'], 'C':np.random.randn(8), 'D':np.random.randn(8)})
df
A B C D
0 foo one 0.229206 -1.899999
1 bar one 0.174972 0.328746
2 foo two -1.384699 -1.691151
3 bar three -1.008328 -0.915467
4 foo two -0.065298 -0.107240
5 bar two 1.871916 0.798135
6 foo one 1.589609 -1.682237
7 foo three 2.292783 0.639595
讓我們假設我們有興趣來計算給定x =一(Y = FOO)的概率爲:P(Y = FOO | X =之一)=?
方法1:
df.groupby('B')['A'].value_counts()/df.groupby('B')['A'].count()
B
one foo 0.666667
bar 0.333333
three foo 0.500000
bar 0.500000
two foo 0.666667
bar 0.333333
dtype: float64
因此,答案是:0.6667
方法2:x的
概率=之一:0.375
df['B'].value_counts()/df['B'].count()
one 0.375
two 0.375
three 0.250
dtype: float64
的Y = FOO概率:0.625
df['A'].value_counts()/df['A'].count()
foo 0.625
bar 0.375
dtype: float64
(x = 1 | y = foo)的概率:0。4
df.groupby('A')['B'].value_counts()/df.groupby('A')['B'].count()
A
bar one 0.333333
two 0.333333
three 0.333333
foo one 0.400000
two 0.400000
three 0.200000
dtype: float64
因此:P(Y = FOO | X =一個)= P(X =一個| Y =富)* P(Y = FOO)/ P(X =一個)= 0.4 * 0.625/0.375 = 0.6667
非常感謝,如果我想將它除以b的無條件概率,我該怎麼辦? b的無條件概率是df.groupby('b')?我可以通過這個來劃分你的嗎? –