如何基于熊猫中的多个列得出分数(排名)

时间:2019-04-03 18:13:52

标签: python pandas dataframe

我有一个如下数据框:

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_IDLikedShared均为Y,则Score = 2(如果有)是Y,然后是Score = 1,否则是Score = 0
  2. 对于特定的User_ID:如果将Game_ID重复两次以上,则Score = 2,如果重复两次,则1,否则重复Score = 0。 / li>
  3. 对于特定的User_ID:如果Game_ID属于Category的最高类别Score = 1,则Score = 0

    例如:User_ID = 1Top Category = Music(因为它的频率计数是4分之5),为此用户在Game_ID类别中的所有Music将获得{{1 }}。

    最后,因为我们需要每个1-User_ID的累积分数。   例如:Game_IDUser_ID = 1

    1)喜欢/共享=任何人都是Game_ID = 11-Y

    2)该Score = 1中的Category属于该User_ID的“顶级类别(音乐)”,因此Game_ID

    3)为此Score : 1-Game_ID重复两次User_ID     累积分数:Score : 2

以下是预期的输出:

1+1+2 = 4

注意:在预期的输出中,只有User_ID,Game_ID和Rating是至关重要的。        其余的列仅用于详细信息。

您的朋友可以帮我吗?

1 个答案:

答案 0 :(得分:0)

让我们尝试一下:

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