Python: Pandas GroupBy текстовый столбец на основе макс. значение других столбцов [дубликат]

Обратите внимание на класс «MAIN», в который помещается элемент, например

<div class="container">
     <ul class="select">
         <li> First</li>
         <li>Second</li>
    </ul>
</div>

. В приведенном выше сценарии объект MAIN, который будет наблюдать jQuery, является «контейнером».

Тогда вы в основном будете иметь имена элементов в контейнере, такие как ul, li и select:

$(document).ready(function(e) {
    $('.container').on( 'click',".select", function(e) {
        alert("CLICKED");
    });
 });
101
задан tommy.carstensen 26 March 2017 в 01:00
поделиться

7 ответов

In [1]: df
Out[1]:
    Sp  Mt Value  count
0  MM1  S1     a      3
1  MM1  S1     n      2
2  MM1  S3    cb      5
3  MM2  S3    mk      8
4  MM2  S4    bg     10
5  MM2  S4   dgd      1
6  MM4  S2    rd      2
7  MM4  S2    cb      2
8  MM4  S2   uyi      7

In [2]: df.groupby(['Mt'], sort=False)['count'].max()
Out[2]:
Mt
S1     3
S3     8
S4    10
S2     7
Name: count

Чтобы получить индексы исходного DF, вы можете сделать:

In [3]: idx = df.groupby(['Mt'])['count'].transform(max) == df['count']

In [4]: df[idx]
Out[4]:
    Sp  Mt Value  count
0  MM1  S1     a      3
3  MM2  S3    mk      8
4  MM2  S4    bg     10
8  MM4  S2   uyi      7

Обратите внимание, что если у вас есть несколько максимальных значений для каждой группы, все будут возвращены.

Обновить

По градиентной вероятности, что это то, что запросит OP:

In [5]: df['count_max'] = df.groupby(['Mt'])['count'].transform(max)

In [6]: df
Out[6]:
    Sp  Mt Value  count  count_max
0  MM1  S1     a      3          3
1  MM1  S1     n      2          3
2  MM1  S3    cb      5          8
3  MM2  S3    mk      8          8
4  MM2  S4    bg     10         10
5  MM2  S4   dgd      1         10
6  MM4  S2    rd      2          7
7  MM4  S2    cb      2          7
8  MM4  S2   uyi      7          7
141
ответ дан Zelazny7 20 August 2018 в 11:25
поделиться
  • 1
    Вы можете изменить свой вопрос, используя форматирование кода, чтобы уточнить ваш запрос? – Zelazny7 29 March 2013 в 17:37
  • 2
    Извините, но я не знаю, как форматировать код в комментарии, поэтому я опубликовал свои данные, следуя первому вопросу – jojo12 29 March 2013 в 18:19
  • 3
    @ Zelazny7, есть ли способ принять этот ответ, чтобы применить к группировке по столбцу, а затем посмотреть на 2 столбца и сделать максимум их, чтобы получить большее из двух? Я не могу заставить это работать. В настоящее время у меня есть: def Greater (Merge, maximumA, maximumB): a = Объединить [maximumA] b = Объединить [maximumB] return max (a, b) Merger.groupby («Search_Term»). Apply (Greater, & quot; ; Ratio_x & Quot;, & Quot; Ratio_y & Quot;) – mkheifetz 15 November 2017 в 21:35
  • 4
    @ Zelazny7 Я использую второй подход idx. Но я могу позволить себе только один максимум для каждой группы (и мои данные имеют несколько дубликатов-max). есть ли способ обойти это с помощью вашего решения? – Mike Palmice 3 January 2018 в 21:36
  • 5
    на самом деле, это не работает для меня. Я не могу отследить проблему, потому что dataframe, если выйдет из большой, но решение от @Rani работает хорошо – Ladenkov Vladislav 18 February 2018 в 19:09
df = pd.DataFrame({
'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4','MM4'],
'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
'count' : [3,2,5,8,10,1,2,2,7]
})

df.groupby(['sp', 'mt']).apply(lambda grp: grp.nlargest(1, 'count'))
0
ответ дан George Liu 20 August 2018 в 11:25
поделиться

Попробовав решение, предложенное Желязным на относительно большом DataFrame (~ 400 тыс. строк), я нашел его очень медленным. Вот альтернатива, которую я обнаружил, чтобы быстрее выполнять заказы на моем наборе данных.

df = pd.DataFrame({
    'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4', 'MM4'],
    'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
    'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
    'count' : [3,2,5,8,10,1,2,2,7]
    })

df_grouped = df.groupby(['sp', 'mt']).agg({'count':'max'})

df_grouped = df_grouped.reset_index()

df_grouped = df_grouped.rename(columns={'count':'count_max'})

df = pd.merge(df, df_grouped, how='left', on=['sp', 'mt'])

df = df[df['count'] == df['count_max']]
24
ответ дан landewednack 20 August 2018 в 11:25
поделиться
  • 1
    действительно, это намного быстрее. преобразование кажется слишком медленным для большого набора данных. – goh 11 July 2014 в 07:30
  • 2
    Можете ли вы добавить комментарии, чтобы объяснить, что делает каждая строка? – tommy.carstensen 26 March 2017 в 01:00
  • 3
    fwiw: Я нашел, что более элегантное решение от @ Zelazny7 заняло много времени, чтобы выполнить мой набор из 100 тыс. строк, но этот сценарий прошел довольно быстро. (У меня теперь есть устаревший 0.13.0, который может объяснить медленность). – Roland 4 May 2017 в 21:25
  • 4
    это здорово - спасибо за обмен. – claude 25 May 2017 в 15:35
  • 5
    Но при этом df[df['count'] == df['count_max']] потеряет строки NaN, а также ответы выше. – Qy Zuo 20 July 2017 в 07:38

Для меня самым простым решением будет сохранение значения, когда счетчик равен максимальному. Поэтому достаточно одной строки:

df[df['count'] == df.groupby(['Mt'])['count'].transform(max)]
6
ответ дан PAC 20 August 2018 в 11:25
поделиться

Вы можете сортировать dataFrame по счету, а затем удалять дубликаты. Я думаю, что это проще:

df.sort_values('count', ascending=False).drop_duplicates(['Sp','Mt'])
62
ответ дан Rani 20 August 2018 в 11:25
поделиться

Простое решение: применить функцию idxmax (), чтобы получить индексы строк с максимальными значениями. Это отфильтровывало бы все строки с максимальным значением в группе.

In [365]: import pandas as pd

In [366]: df = pd.DataFrame({
'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4','MM4'],
'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
'count' : [3,2,5,8,10,1,2,2,7]
})

In [367]: df                                                                                                       
Out[367]: 
   count  mt   sp  val
0      3  S1  MM1    a
1      2  S1  MM1    n
2      5  S3  MM1   cb
3      8  S3  MM2   mk
4     10  S4  MM2   bg
5      1  S4  MM2  dgb
6      2  S2  MM4   rd
7      2  S2  MM4   cb
8      7  S2  MM4  uyi


### Apply idxmax() and use .loc() on dataframe to filter the rows with max values:
In [368]: df.loc[df.groupby(["sp", "mt"])["count"].idxmax()]                                                       
Out[368]: 
   count  mt   sp  val
0      3  S1  MM1    a
2      5  S3  MM1   cb
3      8  S3  MM2   mk
4     10  S4  MM2   bg
8      7  S2  MM4  uyi

### Just to show what values are returned by .idxmax() above:
In [369]: df.groupby(["sp", "mt"])["count"].idxmax().values                                                        
Out[369]: array([0, 2, 3, 4, 8])
23
ответ дан Surya 20 August 2018 в 11:25
поделиться
  • 1
    Вопроситель здесь указал "I want to get ALL the rows where count equals max in each group", а idxmax Return[s] index of first occurrence of maximum over requested axis" согласно документам (0.21). – Max Power 19 December 2017 в 12:55
  • 2
    Лучший ответ здесь, ИМХО. – tmthyjames 12 February 2018 в 22:40

Используйте методы groupby и idxmax:

  1. передать col date в datetime:
    df['date']=pd.to_datetime(df['date'])
    
  2. получить индекс max столбца date, после groupyby ad_id:
    idx=df.groupby(by='ad_id')['date'].idxmax()
    
  3. получить требуемые данные:
    df_max=df.loc[idx,]
    

Out [54]:

ad_id  price       date
7     22      2 2018-06-11
6     23      2 2018-06-22
2     24      2 2018-06-30
3     28      5 2018-06-22
1
ответ дан Tim Diekmann 20 August 2018 в 11:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: