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

时间:2017-08-24 18:07:43

标签: 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

我希望按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_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'  ]

但我很远!我调查了这个questionthis,但它们没有用。

3 个答案:

答案 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