У меня есть 2 больших кадра данных (ниже приведены только выдержки), содержащие информацию о дорожно-транспортных происшествиях, где df_veh
содержит информацию о транспортных средствах, а df_ped
содержит количество пешеходов, вовлеченных в каждую аварию. veh_type
показывает тип транспортных средств, попавших в аварию (1 = велосипед, 2 = автомобиль, 3 = автобус). Они связаны с acc_index
, обозначающим уникальный несчастный случай.
veh_data = {'acc_index': ['001', '002', '002', '003', '003', '004', '005', '005', '006',
'006', '007', '007', '008', '008', '008', '009', '009', '009'],
'veh_type': ['1', '1', '2', '1', '1', '1', '2', '2', '2', '3', '1', '2', '1', '1',
'1', '1', '2', '2'] }
df_veh = pd.DataFrame (veh_data, columns = ['acc_index', 'veh_type'])
ped_data = {'acc_index': ['001', '002', '003', '004', '005', '006', '007', '008', '009'],
'pedestrians': ['1', '2', '0', '1', '4', '3', '0', '1', '2'] }
df_ped = pd.DataFrame (ped_data, columns = ['acc_index', 'pedestrians'])
Я хочу подсчитать количество несчастных случаев (ПО УНИКАЛЬНОМУ acc_index
ТОЛЬКО ОДИН РАЗ):
- между автомобилями и велосипедами (
veh_type==1
и veh_type==2
) - между велосипедами и пешеходами (
veh_type==1
и pedestrians>=1
) - между автомобилями и пешеходами (
veh_type==2
и pedestrians>=1
) - между только автомобилями (
veh_type==2
для того же acc_index) - между только велосипедами (
veh_type==1
для того же acc_index) - между только пешеходами (
pedestrians>=1
для того же acc_index)
Я пытался сделать это по-разному, но в итоге я получаю разные результаты поэтому я в замешательстве. Например, я пытался подсчитать количество несчастных случаев на велосипеде следующим образом:
df_bikes = df_veh[df_veh['veh_type']==1].groupby('acc_index').sum().reset_index()
bike_ped = pd.merge(df_bikes, df_ped, how='outer', on='acc_index')
bike_ped[(bike_ped['veh_type']==1) & (bike_ped['pedestrians']>=1)].groupby(
'acc_index').sum().reset_index()[['acc_index', 'veh_type', 'pedestrians']]
Другой пример, это то, как я подсчитывал аварии между автомобилями и велосипедами благодаря комментариям в этом посте . Я считаю, что это правильно, по крайней мере. Я пытаюсь найти самый простой способ сделать это (но также отображать подсчитанные строки).
bike_car = df_veh[def_veh.groupby('acc_index')['veh_type'].
transform(lambda g: not({1, 2} - {*g}))][['acc_index', 'veh_type']]
len(bike_car.groupby(['acc_index']).size().reset_index()))