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