2017-10-29 6 views
0

私はDataFrameですが、その行は交通事故を表しています。列の2はWeatherSkidding次のとおりです。パンダでは、別の列の値のセットを与えられた1つの列の値の集合の確率を計算する方法は?

import pandas as pd 

df = pd.DataFrame({'Weather': ['rain', 'fine', 'rain', 'fine', 'snow', 'fine', 'snow'], 
        'Skidding': ['skid', 'skid', 'no skid', 'no skid', 'skid', 'no skid', 'jackknife']}) 

私はそれはそれがないときに比べて雨や雪が降っている時に横滑りやジャックナイフ現象のいずれかが発生することがあるどのくらいの可能性が高い計算したいと思います。

df_rainsnow = df[[weather in ('rain', 'snow') for weather in df.Weather]] 
df_rainsnow_skid = df_rainsnow[[skid in ('skid', 'jackknife') for skid in df_rainsnow.Skidding]] 

df_fine = df[df.Weather == 'fine'] 
df_fine_skid = df_fine[[skid in ('skid', 'jackknife') for skid in df_fine.Skidding]] 

relative_probability = len(df_rainsnow_skid)/len(df_fine_skid) 

この例では3.0relative_probabilityと評価されます。これまでのところ私は、ブールインデックスと4つの補助データフレームを用いて溶液を作ってみました。しかし、これは不必要に冗長なようですが、私はそれをリファクタリングしたいと思います。私が試した

一つの解決策は、これは、すべての気象状況では発生しませんKeyErrorjackknifeためにつながり、そしてとにかくまた、すべての用語を書き出すことが冗長である、しかし

counts = df.groupby('Weather')['Skidding'].value_counts() 

relative_probability = (counts['rain']['skid'] + counts['snow']['skid'] 
    + counts['rain']['jackknife'] + counts['snow']['jackknife'])/(counts['fine']['skid'] + counts['fine']['jackknife']) 

です。これを達成するためのよりよい方法は何ですか?

+0

https://stackoverflow.com/questions/29757551/pandas-indexing-using -multiple-isin-clauses –

答えて

1

... in ... for ...の代わりにisinを使用できます。また、あなただけのだけの条件、sumdivideを構築し、末尾に番号が必要な場合は、データフレームをフィルタリングする必要はありません:

rain_snow = df.Weather.isin(['rain', 'snow']) 
fine = df.Weather.eq('fine') 
skid = df.Skidding.isin(['skid', 'jackknife']) 
​ 
(rain_snow & skid).sum()/(fine & skid).sum() 
# 3 
関連する問題