В python создайте новые столбцы, используя прошлые переменные - PullRequest
1 голос
/ 27 сентября 2019

У меня есть фрейм данных панд об определенных спортивных соревнованиях.У меня есть 6 команд: A, B, C, D, E и F. У соревнования есть 38 недель.В каждой слабости у нас есть команда хозяев дома против команды гостей.Я знаю, что количество командных матчей не совпадает с 38 неделями, но это просто для иллюстрации проблемы.Мой df такой:

df
ownerh_team  visit_team   some_var        weak    some_var2    score
          A           B          1           1            5        3
          C           D          2           1            3        3
          E           F          1           1            1        1

          A           D          4          38            2        0
          B           D          2          38            3        0
          F           E          1          38            1        1

Переменная Score связана с домашней командой владельца (ownerh_team).Если победит хозяин хозяина, тогда будет 3 балла. Если победит команда гостей, наберется 0. И если результат матча будет привязан, счет будет 1.

Я бы хотел построитьфункция new_var_func, которая создает новый столбец, относящийся к прошлым слабостям.Другими словами, для каждой строки df (или эквивалентно для каждой команды владельца дома) и за соответствующую неделю я хочу знать, сколько раз команда хозяев набрала 3 за последние 5 недель.

Я быкак функция с этой структурой ввода:

def new_var_func(data = df, column = 'name_var' , n_past_weeks = 1 , score_value = 3):
    corpus

Обратите внимание, что выходные данные этой функции имеют тот же df, но с одним новым столбцом с именем 'name_var'.Параметр n_past_weeks = y - это количество прошедших недель, которые нужно исследовать.Score_value = x означает, что я хотел бы знать, сколько раз домашняя команда набрала балл = x за последние y недель.

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

1 Ответ

2 голосов
/ 27 сентября 2019

Учитывая следующий фрейм данных:

df = pd.DataFrame([
    ['A','B',1,1,5,3],
    ['C','D',2,1,3,3],
    ['E','F',1,1,1,1],
    ['A','D',4,2,2,3],
    ['B','D',2,2,3,3],
    ['F','E',1,2,1,1],
    ['A','D',4,3,2,3],
    ['B','D',2,3,3,0],
    ['F','E',1,3,1,1]],
    columns=['ownerh_team','visit_team','some_var','week','some_var2','score'])

  ownerh_team visit_team  some_var  week  some_var2  score
0           A          B         1     1          5      3
1           C          D         2     1          3      3
2           E          F         1     1          1      1
3           A          D         4     2          2      3
4           B          D         2     2          3      3
5           F          E         1     2          1      1
6           A          D         4     3          2      3
7           B          D         2     3          3      0
8           F          E         1     3          1      1

Я использовал pandas.Dataframe.query для фильтрации фрейма данных и функцию pandas.Dataframe.apply дляповторить это эффективно.Попробуйте этот код:

def new_var_func(data=df, column='name_var', n_past_weeks=1, score_value= 3):
    df[column] = df.apply(lambda row: len(df[(df.ownerh_team == row.ownerh_team) & 
                                                (df.score == score_value) & 
                                                (df.week >= row.week - n_past_weeks) &
                                                (df.week <= row.week)]), axis=1)
    return df



df = new_var_func(data=df, column='name_var', n_past_weeks=1, score_value=3)

И дает:

  ownerh_team visit_team  some_var  week  some_var2  score  name_var
0           A          B         1     1          5      3         1
1           C          D         2     1          3      3         1
2           E          F         1     1          1      1         0
3           A          D         4     2          2      3         2
4           B          D         2     2          3      3         1
5           F          E         1     2          1      1         0
6           A          D         4     3          2      3         2
7           B          D         2     3          3      0         1
8           F          E         1     3          1      1         0

Примечание : я посчитал, что вы также хотите посчитать результаты текущей недели, если вычтобы исключить неделю, в которую вы запускаете игру из подсчета, замените df.week <= row.week на df.week < row.week или измените запросы, если я неверно истолковал некоторую часть вашего запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...