熊猫:组中排名前10位的字符串

时间:2020-03-06 16:24:43

标签: python pandas pandas-groupby

我想显示每个城市中出现次数最多的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

我仅针对1个城市尝试了以下方法,但不知道如何将其转换为分组依据:

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

2 个答案:

答案 0 :(得分:1)

尝试一下:

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

答案 1 :(得分:0)

您可以通过一个简单的groupby来获取每个城市的电话号码或查询:

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