Я пытаюсь подсчитать частоту определенных значений в кадре данных.
Моя цель - подсчитать, сколько несчастных случаев у меня есть между каждой комбинацией типа транспортного средства и несчастного случая. В идеале я пытаюсь создать таблицу с типами 'Casualty' в виде строк и типами 'Vehicle' в качестве столбцов, а значения внутри таблицы должны быть уникальными подсчетами потерь между каждым из них. Например, если произошла авария между автомобилем и велосипедом, и пострадавшим был только велосипедист, я хочу посчитать его +1 для позиции, где строка «Потери» равна «велосипедисту», а столбец «Транспортное средство» равно » car '.
Одна небольшая часть моего набора данных выглядит следующим образом: Набор данных описывает, какой тип транспортных средств и пострадавших были вовлечены в аварию. Они связаны индексом.
Index = ['201901', '201901', '201902', '201903', '201903', '201904', '201904', '201905',
'201905', '201905']
Vehicle = ['bike', 'car', 'car', 'bus', 'motor', 'bike', 'bike', 'car', 'truck', 'bus']
Casualty = ['cyclist', np.nan, 'carO', np.nan, 'motorROP', 'cyclist', 'cyclist', 'carO',
np.nan, 'busDOP']
list_of_tuples = list(zip(Index, Vehicle, Casualty))
list_of_tuples
df = pd.DataFrame(list_of_tuples, columns = ['Index', 'Vehicle', 'Casualty'])
df = df.set_index('Index')
df
Index Vehicle Casualty
201901 bike cyclist
201901 car NaN
201902 car carO
201903 bus NaN
201903 motor motorROP
201904 bike cyclist
201904 bike cyclist
201905 car carO
201905 truck NaN
201905 bus busDOP
До сих пор я пробовал эти 3 разных способа, каждый из которых дает один и тот же вывод (кроме группового):
# 1st option
df.pivot_table(index='Casualty', columns='Vehicle', fill_value=0, aggfunc='size')
# 2nd option
pd.crosstab(df['Casualty'], df['Vehicle'])
# 3rd option
df.groupby(['Casualty', 'Vehicle'])['Index'].size().unstack(fill_value=0)
# output
Vehicle bike bus car motor
Casualty
busDOP 0 1 0 0
carO 0 0 2 0
cyclist 3 0 0 0
motorROP 0 0 0 1
Но проблема заключается в том, что таким образом я получаю количество комбинаций типа автомобиля и несчастного случая на основе одной и той же комбинации автомобиля и несчастного случая Например, если произошла авария между велосипедом и автомобилем, здесь это считается как 3 велосипедиста, пострадавших среди велосипедов, но я хочу, чтобы их считали как 2 велосипедиста как жертвы для велосипедов, а 1 велосипедиста - как жертва для автомобиля. .
Может быть, я ошибаюсь. Но если у вас есть идея, как решить эту проблему, я был бы признателен.
ОБНОВЛЕНИЕ
Я думал о более простом пути, но все еще не могу прийти к результату. Из начального кадра данных я могу просто преобразовать значения столбцов Vehicle
и Casualty
в несколько столбцов, а затем запросить новый кадр данных. Итак, это будет выглядеть так:
Index Vehicle | Casualty
bike bus car motor truck | cyclist carO motorROP busDOP
201901 1 1 1
201902 1 1
201903 1 1 1 1
201904 2 2
201905 1 1 1 1 1
Мне удалось создать это с помощью этого простого кода, но я не могу запросить его. Кто-то понимает почему?
df.groupby(['Index', 'Vehicle'])[['Vehicle', 'Casualty']]\
.count().unstack(fill_value=0)