Как посчитать отношения двух значений столбцов по группам? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть список полетов в виде кадра данных панд, например:

airline        status          number    ...

Aer Lingus     some error A        14    ...
Aeroflot       success             47    ...
Air Canada     success              2    ...
Air Dolomiti   success              2    ...
Air Europa     some error B         4    ...
Air France     success             40    ...
Alitalia       some error A        10    ...
....

Я делаю несколько вызовов API для каждого полета, который либо завершается успешно, либо выдает ошибку.

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

def calculate_quote_success_ratios(flights):

    success_ratio_per_airline = flights.groupby(['airline', 'status']).count()
    # TODO: Include ratio with failures!

    return success_ratio_per_airline

ожидаемый результат долженбыть примерно таким:

airline        success_ratio

Aer Lingus     0.72
Aeroflot       0.845
Air Canada     0.935
Air Dolomiti   0.5
Air Europa     ...
....

Редактировать : Для ясности, столбец df['numbers'] не имеет значения.Поэтому я только хочу посчитать процент «успехов» ко всем видам ошибок для каждой авиакомпании.

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Вы можете использовать pd.crosstab с normalize='index':

# data from @Chris

res = pd.crosstab(df['airline'], df['status'], values=df['number'],
                  aggfunc='count', normalize='index')

print(res[['success']])

status       success
airline             
AerLingus        0.5
Aeroflot         1.0
AirCanada        1.0
AirDolomiti      1.0
AirEuropa        0.0
AirFrance        0.5
Alitalia         0.5
0 голосов
/ 17 октября 2018

групповой подсчет количества рейсов

count_flight=df.groupby('airline').status.count()

групповой подсчет количества успехов

count_success=df[df['status']=='success'].groupby('airline').status.count()

pandas div возвращает групповое соотношение двух предыдущих кадров данных.

count_success.div(count_flight).fillna(0)
0 голосов
/ 17 октября 2018

Мне пришлось изменить ваш пример, чтобы он работал, но вы можете просто сделать df.groupby(['airline', 'status']).sum() / df.groupby(['airline']).sum()

original df:

airline           status    number
0   Aer Lingus  some error A    14
1   Aeroflot    success 47
2   Air Canada  success 2
3   Air Dolomiti    success 2
4   Air Europa  some error B    4
5   Air France  success 40
6   Alitalia    some error A    10
7   Alitalia    success 10
8   Air France  some error B    10
9   Aer Lingus  success 12



df.groupby(['airline', 'status']).sum() / df.groupby(['airline']).sum()

                                  number
airline         status  
Aer Lingus     some error A     0.538462
               success          0.461538
Aeroflot       success          1.000000
Air Canada      success         1.000000
Air Dolomiti    success         1.000000
Air Europa    some error B      1.000000
Air France    some error B      0.200000
              success           0.800000
Alitalia      some error A      0.500000
              success           0.500000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...