在对分组对象执行操作并相应地创建变量后索引数据框

Indexing a data frame after performing an operation on a grouped object and creating a variable accordingly

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

 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

我想按 IdCategory 分组,然后找到最大分数,并创建一个名为 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_Labelshould be equal to the row ofCategory`对应所有1的最大分数

我试过这个:

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

可是我好远!!我调查了这个 question and this,但它们的帮助还不够。

您可以使用 apply 并获得 Score idxmax,将其用于 Category 值。然后使用 map of 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 个值
  • 分配给新列

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

或者你可以不用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