如何在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
我有一个这种格式的 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