Количество по условию применяется к тому же столбцу в Pandas - PullRequest
2 голосов
/ 18 февраля 2020

Это мой фрейм данных.

acc_index    veh_count    veh_type
001             1            1
002             2            1
002             2            2
003             2            1
003             2            2
004             1            1
005             2            1
005             2            3
006             1            2
007             2            1
007             2            2
008             2            1
008             2            1
009             3            1
009             3            1
009             3            2

acc_index уникален для каждой аварии

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

veh_type показывает тип транспортных средств, вовлеченных в аварию (1 = велосипед, 2 = автомобиль, 3 = автобус).

Что я хочу сделать, это подсчитать количество аварий между автомобилями и велосипедами (так, где veh_type = 1 и veh_type = 9 для того же acc_index ), даже если было задействовано больше автомобилей или велосипедов, я все равно хочу считать это одной аварией. Как я могу это сделать?

Я пытался сделать это с помощью приведенного ниже кода, но я получаю счет всех несчастных случаев, связанных с автомобилями или мотоциклами, и я хочу, чтобы только между ними .

df[(df['veh_count'] >=2) & (df.veh_type.isin(['1','2']))].groupby(['acc_index', 'veh_count', 'veh_type']).count()

Я хочу получить что-то подобное ниже, но также со всем фреймом данных, а не только с общей суммой.

acc_index    veh_count    veh_type     count
002             2            1           
002             2            2
                           count         1
003             2            1
003             2            2
                           count         1
007             2            1
007             2            2
                           count         1
009             3            1
009             3            1
009             3            2
                           count         1
                        total_count      4

Если у вас есть лучшее решение / идея Я был бы признателен.

1 Ответ

4 голосов
/ 18 февраля 2020

IIU C, вы можете проверить veh_type на интересующие и групповые:

(df.assign(car=df.veh_type.eq(1),
          bike=df.veh_type.eq(2))  # change 2 to correct type
   [['acc_index','car','bike']]
   .groupby('acc_index')
   .any()
   .all(1).sum()
)

Выход:

4

Обновление : Если вы хотите, чтобы все строки:

s = (df.assign(car=df.veh_type.eq(1),
          bike=df.veh_type.eq(2))  # change 2 to correct type
   [['acc_index','car','bike']]
   .groupby('acc_index')
   .any()
   .all(1)
)

df[df['acc_index'].map(s)]

Вывод:

    acc_index  veh_count  veh_type
1           2          2         1
2           2          2         2
3           3          2         1
4           3          2         2
9           7          2         1
10          7          2         2
13          9          3         1
14          9          3         1
15          9          3         2
...