Создайте один новый столбец во фрейме данных pandas, состоящий из статистики за предыдущий год для каждого игрока в фрейме данных. - PullRequest
2 голосов
/ 04 августа 2020

(python) В настоящее время у меня есть pandas фрейм данных, который выглядит примерно так:

player        |     year     |     points     |
-----------------------------------------------
LeSean McCoy  |     2012     |     199.3      |
-----------------------------------------------
LeSean McCoy  |     2013     |     332.6      |
-----------------------------------------------
LeSean McCoy  |     2014     |     200.4      |
-----------------------------------------------

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

Я могу сделать groupby, который преобразует фрейм данных в одну строку в этом примере, причем каждый year является отдельным столбцом. Однако мне нужен только один добавленный столбец, например:

player        |     year     |     points     |     prev_year_pts     |
-----------------------------------------------------------------------
LeSean McCoy  |     2012     |     199.3      |        0              |
-----------------------------------------------------------------------
LeSean McCoy  |     2013     |     332.6      |        199.3          |
-----------------------------------------------------------------------
LeSean McCoy  |     2014     |     200.4      |        332.6          |
-----------------------------------------------------------------------

Настоящий фрейм данных, с которым я работаю, имеет более 300 уникальных имен игроков, поэтому я пытался найти решение в этом примере. который также сможет работать с другим именем игрока в примере с желаемым результатом, например:

player               |     year     |     points     |     prev_year_pts     |
------------------------------------------------------------------------------
LeSean McCoy         |     2012     |     199.3      |        0              |
------------------------------------------------------------------------------
LeSean McCoy         |     2013     |     332.6      |        199.3          |
------------------------------------------------------------------------------
LeSean McCoy         |     2014     |     200.4      |        332.6          |
------------------------------------------------------------------------------
Christian McCaffrey  |     2017     |     228.6      |        0              |
------------------------------------------------------------------------------
Christian McCaffrey  |     2018     |     385.5      |        228.6          |
------------------------------------------------------------------------------
Christian McCaffrey  |     2019     |     471.2      |        385.5          |
------------------------------------------------------------------------------

Мне удалось добавить столбец prev_year со следующим кодом:

example["prev_year"] = [x-1 for x in example.groupby(["player"])["year"].get_group("LeSean McCoy")]

Но я застрял в том, как получить prev_year_points из этого и как реализовать таким образом, чтобы можно было вычислить это для каждого player наблюдения ...

1 Ответ

2 голосов
/ 05 августа 2020

Вы можете попробовать сначала отсортировать значения по player и year, а затем сделать groupby + shift:

df=df.sort_values(['player','year'])
df['prev_year_pts']=df.groupby('player')['points'].shift(fill_value=0)

Итак, небольшой пример с образцом, который вы даете:

#create the dataframe
d={'player': {0: 'LeSean McCoy', 1: 'LeSean McCoy', 2: 'LeSean McCoy', 3: 'Christian McCaffrey', 4: 'Christian McCaffrey', 5: 'Christian McCaffrey'},
    'year': {0: 2013, 1: 2012, 2: 2014, 3: 2019, 4: 2018, 5: 2017}, 'points': {0: 199.3, 1: 332.6, 2: 200.4, 3: 228.6, 4: 385.5, 5: 471.2}}

df=pd.DataFrame(d)
df
#                player  year  points
#0         LeSean McCoy  2013   199.3
#1         LeSean McCoy  2012   332.6
#2         LeSean McCoy  2014   200.4
#3  Christian McCaffrey  2019   228.6
#4  Christian McCaffrey  2018   385.5
#5  Christian McCaffrey  2017   471.2


df=df.sort_values(['player','year'])
df
#                player  year  points
#5  Christian McCaffrey  2017   471.2
#4  Christian McCaffrey  2018   385.5
#3  Christian McCaffrey  2019   228.6
#1         LeSean McCoy  2012   332.6
#0         LeSean McCoy  2013   199.3
#2         LeSean McCoy  2014   200.4

df['prev_year_pts']=df.groupby('player')['points'].shift(fill_value=0)
df
#                player  year  points  prev_year_pts
#5  Christian McCaffrey  2017   471.2            0.0
#4  Christian McCaffrey  2018   385.5          471.2
#3  Christian McCaffrey  2019   228.6          385.5
#1         LeSean McCoy  2012   332.6            0.0
#0         LeSean McCoy  2013   199.3          332.6
#2         LeSean McCoy  2014   200.4          199.3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...