Pandas:从列中获取另一列中每个唯一值的最高值

时间:2017-02-05 09:15:30

标签: python pandas

如何为另一列中的每个唯一值获取一列中的最高值,并返回相同的数据帧结构。 这是一个pandas数据帧示例?

       reg.nr   counter      value     ID2  categ             date
1       37367       421     231385      93      A       20.01.2004
2       37368       428     235156      93      B       21.01.2004
3       37369       408     234251      93      C       22.01.2004
4       37372       403     196292      93      D       23.01.2004
5       55523       400     247141      139     E       24.01.2004
6       55575       415     215818      139     F       25.01.2004
7       55576       402     204404      139     A       26.01.2004
8       69940       402     62244       175     B       27.01.2004
9       69941       402     38274       175     C       28.01.2004
10      69942       404     55171       175     D       29.01.2004
11      69943       416     55495       175     E       30.01.2004
12      69944       407     90231       175     F       31.01.2004
13      69945       411     75382       175     A       01.02.2004
14      69948       405     119129      175     B       02.02.2004

我希望返回列的最高值" counter"基于列#34; ID2"的唯一值。在新的pandas数据框架应如下所示:

       reg.nr   counter      value     ID2  categ             date
1       37368       428     235156      93      B       21.01.2004
2       55575       415     215818      139     F       25.01.2004
3       69943       416     55495       175     E       30.01.2004

2 个答案:

答案 0 :(得分:4)

使用drop_duplicates

的一种方法
In [332]: df.sort_values('counter', ascending=False).drop_duplicates(['ID2'])
Out[332]:
    reg.nr  counter   value  ID2 categ        date
2    37368      428  235156   93     B  21.01.2004
11   69943      416   55495  175     E  30.01.2004
6    55575      415  215818  139     F  25.01.2004

对于所需的输出,您可以对两列进行排序,并重置索引

In [336]: (df.sort_values(['ID2', 'counter'], ascending=[True, False])
             .drop_duplicates(['ID2']).reset_index(drop=True)
          )
Out[336]:
   reg.nr  counter   value  ID2 categ        date
0   37368      428  235156   93     B  21.01.2004
1   55575      415  215818  139     F  25.01.2004
2   69943      416   55495  175     E  30.01.2004

答案 1 :(得分:2)

df.loc[df.groupby('ID2')['counter'].idxmax(), :].reset_index()

   index  reg.nr  counter   value  ID2 categ        date
0      2   37368      428  235156   93     B  21.01.2004
1      6   55575      415  215818  139     F  25.01.2004
2     11   69943      416   55495  175     E  30.01.2004

首先,您要按列ID2对数据框进行分组。然后,您获得counter列并计算每个组中此列的(第一个)最大元素的索引。然后使用这些索引来过滤初始数据帧。最后,您重置索引(如果需要)。