2016-06-14 28 views
4

私は、格付け欄に格付けの条件付き確率( 'A'、B '、' C ')を計算したいと考えています。データフレーム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(タイプ=クーペ|レーティング= A)= Prob(タイプ=クーペとレーティング= A)/ Prob(レーティング= 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 

と条件付きちゃったごめんなさい:あなたはreindexを追加必要

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'はレベル1である' rating'レベルに揃えなければなりません。また、 'level = 1'を' level = 'rating''に変更して、なぜこれがうまく動作するのかを知ることができます。それに応じてただ編集されました。 – Stefan

+0

興味深い。私は 'level = 1'で結果を得ていましたが、その結果は正しくありませんでした。それを 'level = 0'に変更すると私に正しい条件付き確率値が与えられました。 – Patthebug

3

追加のために0ミスインの値G組:

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

関連する問題