2015-11-02 51 views
3

我有兩個「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() 

回答

4

要找到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)) 
+0

非常感謝,如果我想將它除以b的無條件概率,我該怎麼辦? b的無條件概率是df.groupby('b')?我可以通過這個來劃分你的嗎? –

2

您可以在列表中傳遞給GROUPBY:

df.groupby(['a','b']).count() 
0

你可以試試這個功能,

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(行|列)

1

考慮到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