Максимальное значение для каждой группы [дубликат]

Вам нужно искать [0] [1] [0] [2] .. и так далее, по обоим измерениям, пока не найдете то, что ищете ...

вы могли бы сделать вложенные для циклов.

Вы также должны опубликовать то, что вы пробовали, чтобы мы могли вам помочь.

искать 2-мерный массив в java

92
задан 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
140
ответ дан Zelazny7 15 August 2018 в 20:45
поделиться
  • 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 15 August 2018 в 20:45
поделиться

Попробовав решение, предложенное Желязным на относительно большом 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 15 August 2018 в 20:45
поделиться
  • 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 15 August 2018 в 20:45
поделиться

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

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

Простое решение: применить функцию 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])
22
ответ дан Surya 15 August 2018 в 20:45
поделиться
  • 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 15 August 2018 в 20:45
поделиться
Другие вопросы по тегам:

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