2017-02-05 4 views
2

Как получить максимальное значение в одном столбце для каждого уникального значения в другом столбце и вернуть ту же структуру структуры данных назад. Вот пример данных в виде панды?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 

Где я хочу вернуть максимальное значение столбца «счетчика» на основе уникального значения столбца «ID2». После того, как новый панды dataframe должен выглядеть следующим образом:

 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 

ответ

3

Один из способов использования 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 
+0

Спасибо Джон для ответа, я принял ваш ответ, потому что время выполнения в вашем методе в 100 раз быстрее, чем метод Ilya V. Schurov с группировкой – RaduS

+0

Я не очень уверен. Я чувствую, что метод IIya будет работать быстрее для больших данных. Вам нужно будет проверить это на своих машинах. – Zero

+1

на моем примере из 110000 строк, ваш выполнен в 0.031253 секунд, тогда как Илья в 1.84827 секундах, ок в 60 раз быстрее; но все же намного лучше – RaduS

1
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 

Во-первых, вы Группирование dataframe по столбцам ID2. Затем вы получите столбец counter и вычислите индекс (первого) максимального элемента этого столбца в каждой группе. Затем вы используете эти индексы для фильтрации исходного фрейма. Наконец, вы сбрасываете индексы (если вам это нужно).

+0

Спасибо Илья В. Щуров за ответ :) – RaduS

Смежные вопросы

 Смежные вопросы