Python 在对分组对象执行操作并相应地创建变量后,为数据帧编制索引

Python 在对分组对象执行操作并相应地创建变量后,为数据帧编制索引,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个如下所示的数据框: 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进行分组,然后找到最大分数,并创建一个名

我有一个如下所示的数据框:

 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\u 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
应该等于对应于所有1的最大分数的
Category`行

我试过这个:

 df[df['Category_Label']] == df.loc[df.groupby(['Id','Category'])['Score'].transform(lambda a: a.max())],'Category'  ]

但我离你很远!!我对此进行了调查,但他们的帮助还不够

您可以使用
apply
获得
Score
idxmax
,将其用于
类别
值。然后使用
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
  • 使用
    idxmax
    查找
    max
    位置的位置
  • 使用
    transform
    跨所有索引广播
  • 使用
    loc
    中的结果获取
    Category
  • 分配给新列


或者您可以尝试不使用
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

"1594"... 重新启动REPL的时间:p@JohnGalt阅读问题,OP由
['Id','Category']
说。然而,这毫无意义。谢谢你指出这一点。我喜欢你的解决方案,这更干净。
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