Подсчет частоты по равным показателям и состоянию столбца в Pandas кадре данных - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь подсчитать частоту определенных значений в кадре данных.

Моя цель - подсчитать, сколько несчастных случаев у меня есть между каждой комбинацией типа транспортного средства и несчастного случая. В идеале я пытаюсь создать таблицу с типами '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)
...