2017-10-30 4 views
1

私は共通の列Accident_Indexで2つのデータフレーム、vehiclescasualties、それぞれを持っている:パンダでは、別の列の値を与えられた列の値の相対的な確率を計算する方法は?

import pandas as pd 

vehicles = pd.DataFrame({'Accident_Index': [1, 1, 2, 3, 3, 4, 4], 
         'Vehicle_Type': ['car', 'car', 'motorcyle', 'car', 'car', 'car', 'car'], 
         'Sex_Driver': ['male', 'female', 'male', 'female', 'female', 'male', 'male']}) 

casualties = pd.DataFrame({'Accident_Index': [1, 1, 2, 3, 4], 
          'Casualty_Severity': ['fatal', 'serious', 'fatal', 'light', 'fatal']}) 

可視化を容易にするため、ここではvehiclesである:ここ

Accident_Index Sex_Driver Vehicle_Type 
0    1  male   car 
1    1  female   car 
2    2  male motorcyle 
3    3  female   car 
4    3  female   car 
5    4  male   car 
6    4  male   car 

とはcasualtiesです:

Accident_Index Casualty_Severity 
0    1    fatal 
1    1   serious 
2    2    fatal 
3    3    light 
4    4    fatal 

私はどのようにmを計算したいですか男性車の運転手が女性の運転手に関係する事故に比べて致命的である事故がいつでも起こり易い。

はこれまでのところ、私は以下のソリューションを作ってみた:致死率を持つ2件の自動車事故、男性を含む1とがあるので、

dfm = casualties.merge(vehicles, on='Accident_Index') 
dfm_cars = dfm.loc[dfm.Vehicle_Type == 'car'] 

dfm_cars_fatal_male = dfm_cars.isin({'Casualty_Severity': ['fatal'], 'Sex_Driver': ['male']}) 
male_driver_involved_in_fatal_car_accident = (dfm_cars_fatal_male['Casualty_Severity'] & dfm_cars_fatal_male['Sex_Driver']).sum() 

dfm_cars_fatal_female = dfm_cars.isin({'Casualty_Severity': ['fatal'], 'Sex_Driver': ['female']}) 
female_driver_involved_in_fatal_car_accident = (dfm_cars_fatal_female['Casualty_Severity'] & dfm_cars_fatal_female['Sex_Driver']).sum() 

print(male_driver_involved_in_fatal_car_accident/female_driver_involved_in_fatal_car_accident) 

答え、この場合は、3です女性ドライバーと2人の男性ドライバーが関与しています。

ただし、このコードは特に簡潔には見えません。どのように私はこれをリファクタリングすることができますか?

+0

死傷者は少し曖昧ではありません。 2つの同じ事故指数は、異なるcasuality_severityを持っていますか? – Dark

+0

Bharath、これは、2台の車両を含む1回の事故で、2台の死傷者(例えば、各車両の運転手)があったことを意味する。 –

+0

車両データにどのようにマップしますか?最初の '1'は致命的で、2番目の' 1'は深刻ですか?それでマージすると行が繰り返されるためです。それはあなたのためにオックですか? – Dark

答えて

1

IIUCは、あなたがmerge + query + groupby使用することもできます。これは単純にするために

g = casualties.merge(vehicles, on='Accident_Index')\ 
     .query("Vehicle_Type == 'car' and Casualty_Severity == 'fatal'")\ 
     .groupby('Sex_Driver').Sex_Driver.count() 

g/g.sum() 

Sex_Driver 
female 0.25 
male  0.75 
Name: Sex_Driver, dtype: float64 

を、あなたは、変数を使用してクエリの仕事を持つことができます。

vehicle = 'car' 
severity = 'fatal' 

あなたはその後、書き換えることができますquery手順:

query("Vehicle_Type == @vehicle and Casualty_Severity == @severity") 

これは、コードを関数内に配置し、さまざまな入力の組み合わせに対してテストしたい場合に、コードを再利用することを容易にします。

関連する問題