Как извлечь несколько строк на основе соответствующего года плюс 2 предыдущих года из другого фрейма данных - PullRequest
1 голос
/ 16 апреля 2019

Я работаю с данными спортивной статистики и хочу извлечь статистику за последние 3 года.Если у меня есть фрейм данных с игроком и годом, как я могу извлечь строки из другого фрейма данных, у которого есть соответствующий игрок, и тот же год и предыдущий 2?

df1 = pd.DataFrame([['ABC',2018,5,2,3],
['ABC',2017,52,21,31],['ABC',2016,15,12,13],
['ABC',2015,25,22,3]],
columns=['Player','Year','GS','G','MP'])

df1=

Player Year GS G  MP
ABC    2018  5  2  3
ABC    2017 52 21 31
ABC    2016 15 12 13
ABC    2015 25 22 3
df2 = pd.DataFrame([["ABC",2017]], columns=['Player','Year'])

df2=

Player Year
ABC    2017

это должно привести к

Player Year GS G  MP
ABC    2017 52 21 31
ABC    2016 15 12 13
ABC    2015 25 22 3

В конце концов, я хочу сделать суммирование, но его извлечение делает это намного проще.Есть ли питонский способ сделать это, используя слияние или фильтр?

Ответы [ 3 ]

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

Обычный шаблон - указать, какие значения фильтровать, с помощью формы df1[df1.Column == value]. Вы можете объединить несколько следующим образом:

years  = [(df2.Year.values[0] - j) for j in range(3)]
player = df2.Player.values[0]
result = df1[(df1.Player == player) & (df1.Year.isin(years))]
0 голосов
/ 16 апреля 2019

Остальные ответы хороши!Но также это должно сработать:)

# to be safe, at first, sort the DataFrames
df1.sort_index(inplace=True)
df2.sort_index(inplace=True)

# prepare the Masks   Boolean responses
check_1 = df1["Player"] == df2["Player"].to_list()[0]
# to be safe use int() to get integers in the for loop
years_list = (int(df2["Year"].tolist()[0])-i for i in range(0, 3))
check_2 = df1.Year.map(int).isin(years_list)

# apply the masks
print(df1[check_1 & check_2])

В любом случае необязательно нужен DataFrame для хранения соответствующего «Player» и соответствующего «Year».Два списка или даже переменные были бы еще лучше, так как кажется, что вы не установили реальные столбцы в df2, как заметил Эрфан в комментарии под вашим вопросом.

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

merge в 'Player', затем отфильтруйте диапазон года после:

res = df1.merge(df2, on='Player', suffixes=['', '_r'])
res = res.loc[res.Year.between(res.Year_r-2, res.Year_r)].drop(columns='Year_r')

print(res)
#  Player  Year  GS   G  MP
#1    ABC  2017  52  21  31
#2    ABC  2016  15  12  13
#3    ABC  2015  25  22   3

Или, если 'Player' не дублируется в df2, сопоставьте с серией, а затем замаскируйте с помощьюлогическая серия:

s = df1.Player.map(df2.set_index('Player').Year)
df1[df1.Year.between(s-2, s)]

#  Player  Year  GS   G  MP
#1    ABC  2017  52  21  31
#2    ABC  2016  15  12  13
#3    ABC  2015  25  22   3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...