首页 > 解决方案 > 对于pandas中的每个标签,如何获取与基于标签的值子集中的最大值相关联的ID?

问题描述

所以我认为这个问题可以最好地可视化如下,给定一个数据框:

val_1          true_val ID      label
-0.0127894447       0.0  1       A
0.9604560385        1.0  2       A
0.0001271985        0.0  3       A
0.0007419337        0.0  3       B
0.3420448566        0.0  2       B
0.1322384726        1.0  4       B

所以我想要得到的是:

val_1          true_val    label  ID_val_1_highest    ID_true_val_highest
0.9604560385        1.0      A        2                 2
0.3420448566        1.0      B        2                 4

或者更可取的是,只有最后两列(所以只有 ID,所以我可以计算精度和召回率)

我想获取 val_1 和 true_val 都具有最高值的 ID,然后为每个标签返回两个相应的 ID。

任何人都知道如何做到这一点?我试过了:

df.sort_values('val_1', ascending=False).drop_duplicates(['label'])

但对于两个值,它都不会返回与标签 X 的最大值关联的 ID。注意:ID 可以在“ID”列中出现多次。

标签: pythonpandas

解决方案


使用DataFrameGroupBy.idxmaxwith convert IDto index for IDby 最大值val1true_val列,最后添加到第一个DataFrameby DataFrame.join

df1 = df.sort_values('true_val', ascending=False).drop_duplicates(['label'])
print (df1)
      val_1  true_val  ID label
1  0.960456       1.0   2     A
5  0.132238       1.0   6     B

df2 = df.set_index('ID').groupby('label').idxmax().add_suffix('_highest')
print (df2)
       val_1_highest  true_val_highest
label                                 
A                  2                 2
B                  5                 6

df = df1.join(df2, on='label')
print (df)
      val_1  true_val  ID label  val_1_highest  true_val_highest
1  0.960456       1.0   2     A              2                 2
5  0.132238       1.0   6     B              5                 6

推荐阅读