Добавление фильтров в функцию группировки - PullRequest
0 голосов
/ 30 ноября 2018

это мой набор данных:

Day    Player    Score
1        Andy      6
2        Boby      6
3        Andy      4
4        Carl      2
5        Andy      3

Это упрощенный пример, но в основном я хочу добавить новый столбец ('last_pass_date'), который ищет предыдущий индекс, когда 'Player' достигаетоценка> 5.

Что у меня есть:

df['last_pass_date'] = df.groupby(['Player'])['Day'].shift(1)

, но я не уверен, как добавить дополнительный фильтр «Оценка»> 5. Любая помощь будет принята с благодарностью.Спасибо!

РЕДАКТИРОВАТЬ: вывод из моего решения [NaN, NaN, '1', NaN, '3'], когда в идеале это должно быть [NaN, NaN, '1', NaN, '1']поскольку строка 3 не удовлетворяет баллу> 5.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Как насчет этого:

df = pd.DataFrame({"Day": [1, 2, 3, 4, 5],
                   "Player": ["Andy", "Boby", "Andy", "Carl", "Andy"],
                   "Score": [6, 6, 4, 2, 3],
                   })
df['last_pass_date'] = None
passed_indices = df["Score"] > 5
df.loc[passed_indices, 'last_pass_date'] = df.loc[passed_indices, 'Day']
df['last_pass_date'] = df.groupby("Player")['last_pass_date'].apply(
    lambda group: group.shift().ffill())
print(df)

Производит:

   Day Player  Score  last_pass_date
0    1   Andy      6             NaN
1    2   Boby      6             NaN
2    3   Andy      4             1.0
3    4   Carl      2             NaN
4    5   Andy      3             1.0

Идея состоит в том, чтобы установить last_pass_date на текущую дату, когда игрок проходит, а затем заполнить эту колонку вперед для каждого игрока.,Единственный дополнительный трюк - сдвиг на 1 перед заполнением колонки, сгруппированной по игрокам, вперед (таким образом вы получаете дату прохода, на которую игрок ранее прошел)

0 голосов
/ 30 ноября 2018

Создание столбца из passed:

df['passed'] = df.Day[df.Score > 5]

Группировка по Player, смещение passed и прямая заливка для переноса даты последнего прохода

df['last_pass_date'] = df.groupby('Player').passed.apply(lambda x: x.shift().ffill())

Производитследующий вывод для меня:

   Day Player  Score  passed  last_pass_date
0    1   Andy      6     1.0             NaN
1    2   Boby      6     2.0             NaN
2    3   Andy      4     NaN             1.0
3    4   Carl      2     NaN             NaN
4    5   Andy      3     NaN             1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...