Pandas: 10 лучших вхождений строки в группе - PullRequest
1 голос
/ 06 марта 2020

Я хочу показать 5 самых популярных запросов по городу, если в городе нет 5 запросов, показать их все.

Фиктивные данные

data = {'city': ['Paris','Berlin','Barcelona', 'Paris', 'Paris', 'Barcelona', 'Barcelona', 'Barcelona', 'Berlin', 'Berlin',\
                 'Paris','Berlin','Barcelona', 'Paris', 'Paris', 'Barcelona', 'Barcelona', 'Barcelona', 'Berlin', 'Berlin',\
                 'Paris','Berlin','Barcelona', 'Paris', 'Paris', 'Barcelona', 'Barcelona', 'Barcelona', 'Berlin', 'Berlin',\
                 'Paris','Berlin','Barcelona', 'Paris', 'Paris', 'Barcelona', 'Barcelona', 'Barcelona', 'Berlin', 'Berlin'],
        'query': ['orange', 'pizza', 'pizza', 'pizza', 'apple', 'pizza', 'ricecracker', 'pizza', 'tomato', 'tomato',\
                  'orange', 'pizza', 'ricecracker', 'ricecracker', 'pineapple', 'pizza', 'ricecracker', 'pizza', 'ricecracker', 'tomato',\
                  'taco', 'taco', 'pizza', 'pizza', 'pineapple', 'pizza', 'ricecracker', 'pizza', 'tomato', 'tomato',\
                  'apple', 'taco', 'ricecracker', 'ricecracker', 'pineapple', 'pizza', 'ricecracker', 'pizza', 'ricecracker', 'tomato']
       }

df = pd.DataFrame(data, columns = ['city', 'query'])

Желаемый вывод

city       query        count
Barcelona  pizza          10
           ricecracker    6
Berlin     tomato         6
           pizza          2
           ricecracker    2
           taco           2
Paris      pineapple      3
           apple          2
           orange         2   
           pizza          2  
           ricecracker    2

Я пробовал следующее только для одного города, но не знаю, как перевести его в группу:

df[df.city == 'Paris']['query'].value_counts().nlargest(5)

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Попробуйте это:

def get_top_n(df,n):
    to_be_merged = []
    for cities in set(df.city):
        df1 = df.loc[df.city==cities]
        z1 = df1.groupby('city')['query'].value_counts().head(n)
        to_be_merged.append(z1)
    return pd.concat(to_be_merged)

Это дает желаемый результат (так как вы хотите 5 лучших запросов на город): enter image description here

0 голосов
/ 06 марта 2020

Вы можете получить число или количество запросов по городу с помощью простой группы:

df.assign(count=1).groupby(['city', 'query']).count()

, которая дает:

                       count
city      query             
Barcelona pizza            5
          ricecracker      3
Berlin    pizza            2
          ricecracker      1
          tomato           3
Paris     pineapple        2
          pizza            3
          ricecracker      1

Если вы хотите сохранить только пять самых частых запросов, Вы можете отфильтровать результат со вторым groupby:

df.assign(count=1).groupby(['city', 'query']).count().groupby(level=0).apply(lambda x:
             x.sort_values('count', ascending=False).head(5)).reset_index(level=0, drop=True)

, который дает здесь ожидаемый порядок запросов:

                       count
city      query             
Barcelona pizza            5
          ricecracker      3
Berlin    tomato           3
          pizza            2
          ricecracker      1
Paris     pizza            3
          pineapple        2
          ricecracker      1

Вот демонстрационный пример, ограничивающий 2 запроса:

df.assign(count=1).groupby(['city', 'query']).count().groupby(level=0).apply(lambda x: 
            x.sort_values('count', ascending=False).head(2)).reset_index(level=0, drop=True)

                       count
city      query             
Barcelona pizza            5
          ricecracker      3
Berlin    tomato           3
          pizza            2
Paris     pizza            3
          pineapple        2
...