如何在groupby组中找到共同价值?

How to find common values in groupby groups?

我有一个这种格式的 df,我的目标是找到参加多个锦标赛的用户,并最终将他们的 'val' 值设置为他们第一次出现的那个。最初,我想我需要 groupby 'tour' 但后来它需要一些交集,但我不确定如何进行。或者,我可以 pd.crosstab(df.user, df.tour) 但我也不确定如何进行。

df = pd.DataFrame(data = [['jim','1','1', 10],['john','1','1', 12], ['jack','2', '1', 14],['jim','2','1', 10],
                           ['mel','3','2', 20],['jim','3','2', 10],['mat','4','2', 14],['nick','4','2', 20],
                          ['tim','5','3', 16],['john','5','3', 10],['lin','6','3', 16],['mick','6','3', 20]],
                   columns = ['user', 'game', 'tour', 'val'])

您可以在 'user' 上 groupby 并过滤掉只有 1 个元素的组,然后 select 第一个元素,如下所示:

df.groupby(['user']).filter(lambda g:len(g)>1).groupby('user').head(1)

输出


user       game tour    val
0   jim     1   1       10
1   john    1   1       12

因为 df 已经按 tour 排序,我们可以使用 groupby + first:

df['val'] = df.groupby('user')['val'].transform('first')

输出:

    user game tour  val
0    jim    1    1   10
1   john    1    1   12
2   jack    2    1   14
3    jim    2    1   10
4    mel    3    2   20
5    jim    3    2   10
6    mat    4    2   14
7   nick    4    2   20
8    tim    5    3   16
9   john    5    3   12
10   lin    6    3   16
11  mick    6    3   20