Рассчитать процент значений, которые удовлетворяют нескольким условиям в DataFrame - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть DataFrame с информацией о каждой игре March Madness с 1985 года. Теперь я пытаюсь подсчитать процент выигрышей по старшему семени за раунд.Основной DataFrame выглядит следующим образом:

enter image description here

Я подумал, что лучший способ сделать это - создать отдельные функции.Первый из них касается случаев, когда оценка выше, чем команда возвращения по счету 1, и когда оценка 1 выше, чем команда по возвращению очков. 1 Затем добавьте их в конце функции.Следующим для потребностей нужно сделать seed.1 выше, чем seed и return team, затем seed выше, чем seed.1 и return team.1, затем append и последняя функция создают функцию, когда они равны

def func1(x):
    if tourney.loc[tourney['Score']] > tourney.loc[tourney['Score.1']]:
        return tourney.loc[tourney['Team']]
    elif tourney.loc[tourney['Score.1']] > tourney.loc[tourney['Score']]:
        return tourney.loc[tourney['Team.1']]

func1(tourney.loc[tourney['Score']])

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

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

(
    ((tourney['Seed'] > tourney['Seed.1']) & 
     (tourney['Score'] > tourney['Score.1'])) || 
    ((tourney['Seed.1'] > tourney['Seed']) & 
     (tourney['Score.1'] > tourney['Score']))
).sum() / len(tourney)
0 голосов
/ 22 апреля 2019

Вы можете применить построчную функцию, применив лямбда-функцию ко всему фрейму данных с помощью axis=1.Это позволит вам получить True/False столбец 'low_seed_wins'.

С новым столбцом True / False вы можете взять счет и сумму (count - количество игр, а sum - количество побед lower_seed).Используя это, вы можете разделить сумму на количество, чтобы получить коэффициент выигрыша.

Это работает только потому, что ваши младшие начальные команды всегда слева.Если это не так, это будет немного сложнее.

import pandas as pd
df = pd.DataFrame([[1987,3,1,74,68,5],[1987,3,2,87,81,6],[1987,4,1,84,81,2],[1987,4,1,75,79,2]], columns=['Year','Round','Seed','Score','Score.1','Seed.1'])

df['low_seed_wins'] = df.apply(lambda row: row['Score'] > row['Score.1'], axis=1)

df = df.groupby(['Year','Round'])['low_seed_wins'].agg(['count','sum']).reset_index()

df['ratio'] = df['sum'] / df['count']

df.head()


Year    Round   count   sum     ratio
0   1987    3   2       2.0     1.0
1   1987    4   2       1.0     0.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...