2016-06-14 171 views
4

我想計算評級列中評分('A','B','C')的條件概率。如何計算dataframe pandas-python中的值的條件概率?

company  model rating type 
0 ford  mustang  A  coupe 
1 chevy  camaro  B  coupe 
2 ford  fiesta  C  sedan 
3 ford  focus  A  sedan 
4 ford  taurus  B  sedan 
5 toyota  camry  B  sedan 

輸出:

Prob(rating=A) = 0.333333 
Prob(rating=B) = 0.500000 
Prob(rating=C) = 0.166667 

Prob(type=coupe|rating=A) = 0.500000 
Prob(type=sedan|rating=A) = 0.500000 
Prob(type=coupe|rating=B) = 0.333333 
Prob(type=sedan|rating=B) = 0.666667 
Prob(type=coupe|rating=C) = 0.000000 
Prob(type=sedan|rating=C) = 1.000000 

任何幫助,謝謝..!

+1

好,就去做吧:)。 Prob(type = coupe | rating = A)= Prob(type = coupe and rating = A)/ Prob(rating = A)'。 – cel

回答

0

您可以使用groupby

In [2]: df = pd.DataFrame({'company': ['ford', 'chevy', 'ford', 'ford', 'ford', 'toyota'], 
        'model': ['mustang', 'camaro', 'fiesta', 'focus', 'taurus', 'camry'], 
        'rating': ['A', 'B', 'C', 'A', 'B', 'B'], 
        'type': ['coupe', 'coupe', 'sedan', 'sedan', 'sedan', 'sedan']}) 

In [3]: df.groupby('rating').count()['model']/len(df) 
Out[3]: 
rating 
A 0.333333 
B 0.500000 
C 0.166667 
Name: model, dtype: float64 

In [4]: (df.groupby(['rating', 'type']).count()/df.groupby('rating').count())['model'] 
Out[4]: 
rating type 
A  coupe 0.500000 
     sedan 0.500000 
B  coupe 0.333333 
     sedan 0.666667 
C  sedan 1.000000 
Name: model, dtype: float64 
5

您可以使用.groupby()和內置.div()

rating_probs = df.groupby('rating').size().div(len(df)) 

rating 
A 0.333333 
B 0.500000 
C 0.166667 

和條件probs:

df.groupby(['type', 'rating']).size().div(len(df)).div(rating_probs, axis=0, level='rating') 

coupe A   0.500000 
     B   0.333333 
sedan A   0.500000 
     B   0.666667 
     C   1.000000 
+0

我相信'level'參數應該是0,而不是1. – Patthebug

+0

你試過了嗎?當我將上面的工作版本更改爲'level = 0'時,我會丟失值。 'rating_probs'必須與等級爲'rating'的級別相匹配。您還可以將'level = 1'更改爲'level ='rating'',以便更好地瞭解其原因。剛剛編輯相應。 – Stefan

+0

有趣。我得到了'level = 1'的結果,但這些結果不正確。將它改爲「level = 0」給了我正確的條件概率值。 – Patthebug

3

你需要添加reindex爲missin添加0值摹對:

mux = pd.MultiIndex.from_product([df['rating'].unique(), df['type'].unique()]) 
s = (df.groupby(['rating', 'type']).count()/df.groupby('rating').count())['model'] 
s = s.reindex(mux, fill_value=0) 
print (s) 
A coupe 0.500000 
    sedan 0.500000 
B coupe 0.333333 
    sedan 0.666667 
C coupe 0.000000 
    sedan 1.000000 
Name: model, dtype: float64 

而另一種解決方案,謝謝Zero

s.unstack(fill_value=0).stack() 
+0

's.unstack(fill_value = 0).stack()'應該可以嗎? – Zero