2016-10-21 3 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 

Я хочу, чтобы мой выход выглядеть примерно так (имена столбцов заменяются, чтобы дифференцировать их от выше dataframe):панды: сложный фильтр через 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 = 0 и crash_drugs = 1;

«наркотического опьянения водителя в аварии», где crash_drinking = 0, crash_drugs = 1, driver_drinking = 0, и driver_drugs = 1.

же для ряда В, за исключением того, где "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)] 

Etc.

я предпочел бы сделать это через groupby или .apply(), поскольку я думаю, что это было бы быстрее, чем цикл через все эти запросы. Но я не уверен в правильном синтаксисе. Может быть, я должен сделать .groupby() в столбце «Урон» и пойти оттуда ...?

+0

Вашего определение dataframe не соответствует его представлению (имена столбцов различны). –

+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

Смежные вопросы