【发布时间】:2018-07-01 18:40:21
【问题描述】:
我想在groupby 返回的组中应用排序和限制,如this question。但是,我有多个聚合,我希望所有聚合都保留在结果中。
这是一个简单的例子:
products = ["A", "B", "C", "D"]
stores = ["foo", "bar", "baz"]
n = 30
product_list = [products[i] for i in np.random.randint(0, len(products), n)]
store_list = [stores[i] for i in np.random.randint(0, len(stores), n)]
rating_list = np.random.random(n) * 5
sales_list = np.random.random(n) * 10000
df = pd.DataFrame(
{'store': store_list,
'product': product_list,
'sales': sales_list,
'rating': rating_list})
df = df[['store', 'product', 'sales', 'rating']]
df[:5]
我想按store 和product 以及sum 和count 和sales 分组,同时使用rating 的mean。
这很简单:
dfg = df.groupby(['store', 'product']).agg({'sales': ['sum', 'count'],
'rating': 'mean'})
现在,我只想保留每组中评分最高的两个行。我可以得到这个如下(使用来自1的有点不直观的[对我]咒语的多级扩展):
g = dfg[('rating', 'mean')].groupby(
level=0, group_keys=False).apply(
lambda x: x.sort_values(ascending=False).head(2))
g
这将返回以下Series:
store product
bar B 3.601135
A 1.867449
baz B 2.984196
D 2.780500
foo B 3.767912
D 3.129346
Name: (rating, mean), dtype: float64
但我丢失了 ('sales', 'sum') 和 ('sales', 'count') 列。
我怀疑我需要提取 g.index 并以某种方式使用它,但无法对其进行排序(双关语)。
编辑:下面的答案设法给了我正在寻找的组,但我真正想要的是一种稳定的排序,我不仅可以获得每个组中的前 N 个平均评分,而且组本身排序后,第一组的评分最高,等等。在某种程度上,这只是锦上添花,因为我现在拥有我想要的值,并且希望报告更漂亮。
【问题讨论】:
-
赞成双关语。
标签: python pandas sorting pandas-groupby