我有一个如下所示的数据框:
Id Category Score
1 M 0.2
2 C 0.4
2 M 0.3
1 C 0.1
2 M 0.3
1 M 0.2
1 C 0.1
1 C 0.1
2 C 0.4
我希望按Id
和Category
进行分组,然后找到最高分数,并创建一个名为Category_Label
的新变量,其行最多等于Category
得分指数。
输出应该如下所示
Id Category Score Category_Label
1 M 0.2 M
2 C 0.4 C
2 M 0.3 C
1 C 0.1 M
2 F 0.03 C
1 M 0.2 M
1 C 0.1 M
1 E 0.01 M
2 C 0.4 C
换句话说,新变量' Category_Label should be equal to the row of
类别`对应于所有1的最高得分
我试过了:
df[df['Category_Label']] == df.loc[df.groupby(['Id','Category'])['Score'].transform(lambda a: a.max())],'Category' ]
答案 0 :(得分:4)
您可以使用apply
并获取Score
idxmax
,将其用于Category
值。然后使用,map
Id
In [1591]: df.Id.map(df.groupby('Id').apply(lambda x: x.loc[x.Score.idxmax(), 'Category']))
Out[1591]:
0 M
1 C
2 C
3 M
4 C
5 M
6 M
7 M
8 C
Name: Id, dtype: object
详细
In [1592]: df.groupby('Id').apply(lambda x: x.loc[x.Score.idxmax(), 'Category'])
Out[1592]:
Id
1 M
2 C
dtype: object
In [1593]: df['Category_Label'] = df.Id.map(
df.groupby('Id')
.apply(lambda x: x.loc[x.Score.idxmax(), 'Category']))
In [1594]: df
Out[1594]:
Id Category Score Category_Label
0 1 M 0.2 M
1 2 C 0.4 C
2 2 M 0.3 C
3 1 C 0.1 M
4 2 M 0.3 C
5 1 M 0.2 M
6 1 C 0.1 M
7 1 C 0.1 M
8 2 C 0.4 C
答案 1 :(得分:4)
idxmax
查找max
位置的位置。 transform
在所有索引中广播。loc
中的结果获取Category
值df.assign(
Category_Label=df.loc[
df.groupby('Id').Score.transform('idxmax'),
'Category'
].values
)
Id Category Score Category_Label
0 1 M 0.2 M
1 2 C 0.4 C
2 2 M 0.3 C
3 1 C 0.1 M
4 2 M 0.3 C
5 1 M 0.2 M
6 1 C 0.1 M
7 1 C 0.1 M
8 2 C 0.4 C
答案 2 :(得分:1)
或者您可以在没有groupby
df.merge(df.sort_values(['Id','Score']).\
drop_duplicates(['Id'],keep ='last')[['Id','Category']],on='Id',how='left').\
rename(columns={'Category_x':'Category','Category_y':'Category_Label'})
Out[176]:
Id Category Score Category_Label
0 1 M 0.20 M
1 2 C 0.40 C
2 2 M 0.30 C
3 1 C 0.10 M
4 2 F 0.03 C
5 1 M 0.20 M
6 1 C 0.10 M
7 1 E 0.01 M
8 2 C 0.40 C