我有一个如下数据框:
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
:
User_ID
:如果对于特定的Game_ID
,Liked
和Shared
均为Y
,则Score = 2
(如果有)是Y
,然后是Score = 1
,否则是Score = 0
。 User_ID
:如果将Game_ID
重复两次以上,则Score = 2
,如果重复两次,则1
,否则重复Score = 0
。 / li>
对于特定的User_ID
:如果Game_ID
属于Category
的最高类别Score = 1
,则Score = 0
例如:User_ID = 1
,Top Category = Music
(因为它的频率计数是4分之5),为此用户在Game_ID
类别中的所有Music
将获得{{1 }}。
最后,因为我们需要每个1
-User_ID
的累积分数。
例如:Game_ID
,User_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是至关重要的。 其余的列仅用于详细信息。
您的朋友可以帮我吗?
答案 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