2016-10-21 39 views
3
test = pd.DataFrame({'injury':['A', 'B', 'B', 'A', 'A', 'C', 'A', 'B', 'A'], 'crash_drinking':[1, 1, 1, 0, 0, 0, 1, 0, 1], 'crash_drugs':[0,0,0,1,1,0,0,1,1], 'driver_drinking':[1,1,0,0,0,0,0,1,0], 'driver_drugged':[0,0,0,0,1,0,0,1,0]}) 

    crash_drinking crash_drugs driver_drinking driver_drugged injury 
0    1   0    1    0  A 
1    1   0    1    0  B 
2    1   0    0    0  B 
3    0   1    0    0  A 
4    0   1    0    1  A 
5    0   0    0    0  C 
6    1   0    0    0  A 
7    0   1    1    1  B 
8    1   1    0    0  A 

て複雑なフィルタが、私は私の出力は、(列名は、上記のデータフレームと区別するために変更されている)、このようなものを見てみたい:パンダ:GROUPBY

drinking crash drinking driver in crash drugged crash drugged driver in crash 
A    2      1     2       1 
B    2      1     1       0 

場合は、最初の行、"injury" = 'A'ため、以下のフィルタが配置されています:

「飲酒クラッシュ」は、カウントです。crash_drinking = 1およびcrash_drugs = 0;

「飲酒運転のクラッシュ」は、crash_drinking = 1,crash_drugs = 0,driver_drinking = 1,およびdriver_drugs is 0です。

crash_drinking = 0crash_drugs = 1;は "クラッシュにドライバを薬漬け" 場合

"がクラッシュを薬漬け" である場合crash_drinking = 0crash_drugs = 1driver_drinking = 0,及びdriver_drugs = 1あります。 B列のための同じ

"injury" = 'B'.

は、今私はセットアップの.locフィルタの束を持っているところだ除い:

test.loc[(test['injury'] == 'A') & (test['crash_drinking'] == 1) & (test['crash_drugs'] == 0)] 
test.loc[(test['injury'] == 'A') & (test['crash_drinking'] == 0) & (test['crash_drugs'] == 1)] 
test.loc[(test['injury'] == 'A') & (test['crash_drinking'] == 1) & (test['crash_drugs'] == 0) & (test['driver_drinking'] == 1) & (test['driver_drugged'] == 0)] 

私はむしろこれを行うと思いますgroupby、または.apply()を使用すると、すべてのクエリをループするよりも速くなると思います。しかし、私はそれを行うための適切な構文が不明です。たぶん私は "負傷者"の列の.groupby()を実行し、そこから行くべきでしょうか?

+0

データフレームのあなたの定義は、(列名が異なっている)その表現と一致していません。 –

+0

希望する出力の列が入力と異なることを意味しますか?新しい列は元の列と同じではなく、列の組み合わせであるため、それらを区別したいと考えました。私はそれらを元に戻すことができますが、同じであればもっと混乱すると思いました。 – ale19

+0

いいえ、コードの最初の行とその直後に表示されるデータフレームを見てください。列名が異なるため、混乱します。 –

答えて

1
result = pd.DataFrame() 
result['drinking crash'] = (test['crash_drinking'] == 1) & (test['crash_drugs'] == 0) 
result['drinking driver in crash'] = ((test['crash_drinking'] == 1) & (test['crash_drugs'] == 0) 
             & (test['driver_drinking'] == 1) & (test['driver_drugs'] == 0)) 
result['drugged crash'] = (test['crash_drinking'] == 0) & (test['crash_drugs'] == 1) 
result['drugged driver in crash'] = ((test['crash_drinking'] == 0) & (test['crash_drugs'] == 1) 
            & (test['driver_drinking'] == 0) & (test['driver_drugs'] == 1)) 
result = result.astype(int) 
result['injury'] = test['injury'] 
result.groupby('injury').sum() 

resulting dataframe