Как получить оценку (рейтинг) на основе нескольких столбцов в пандах - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть датафрейм, как показано ниже:

User_ID Game_ID Liked   Shared  Category
1       11       Y       N      Music
1       11       Y       N      Music
1       22       Y       Y      Music
1       11       Y       N      Music
1       33       N       N      Dance
2       33       N       Y      Dance
2       44       Y       Y      Peace
2       11       N       N      Music

Мне нужно получить новый столбец Rating со следующей логикой:

  1. Для определенного User_ID: Если для определенного Game_ID оба значения Liked и Shared равны Y, тогда Score = 2, если любое из них равно Y, тогда Score = 1, иначе Score = 0.
  2. Для конкретного User_ID: если Game_ID повторяется более 2 раз, то Score = 2, если 2 раза, то 1, иначе Score = 0.
  3. Для определенного User_ID: если Game_ID принадлежит Category, который является высшей категорией Score = 1, иначе Score = 0

    Например: User_ID = 1, Top Category = Music (поскольку его счетчик частоты равен 4 из 5), все категории Game_ID в Music для этого пользователя получат балл 1.

    Наконец, нам нужен совокупный балл для каждого User_ID - Game_ID. Например: User_ID = 1, Game_ID = 11.

    1) Liked / Shared = Любой из них Y - Score = 1

    2) Category этого Game_ID относится к высшей категории (музыка) для этого идентификатора пользователя, поэтому Score : 1

    3) Game_ID повторяется более двух раз для этого User_ID - Score : 2 Совокупный балл: 1+1+2 = 4

Ниже ожидаемый результат:

User_ID Game_ID Like/Share  Category    Game_repeat Rating
      1      11          1         1              2      4
      1      22          2         1              0      3
      1      33          0         0              0      0
      2      33          1         0              0      1
      2      44          2         0              0      2
      2      11          0         0              0      0

ПРИМЕЧАНИЕ. В ожидаемом выводе важны только User_ID, Game_ID и Rating. Остальные столбцы только для деталей.

Можете ли вы, друзья, помочь мне?

1 Ответ

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

Давайте попробуем это:

df['Cond1'] = (df['Liked'] == 'Y').astype(int) + (df['Shared'] == 'Y').astype(int)

df['Cond2'] = df.groupby(['User_ID','Game_ID'])['Game_ID'].transform('size').sub(1).clip(0,2)

df['Cond3'] = df.groupby('User_ID')['Category'].apply(lambda x: ((x.value_counts().head(1).index[0] == x) & (x.value_counts().head(1).values[0] > 1).astype(int)))

df['Score'] = df['Cond1'] + df['Cond2'] + df['Cond3']

df_out = df.groupby(['User_ID','Game_ID'])['Score'].max().reset_index()

df_out

Вывод:

   User_ID  Game_ID  Score
0        1       11      4
1        1       22      3
2        1       33      0
3        2       11      0
4        2       33      1
5        2       44      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...