python-分组内的Pandas groupby排序保留了多个聚合
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-分组内的Pandas groupby排序保留了多个聚合,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1818字,纯文字阅读大概需要3分钟。
内容图文
![python-分组内的Pandas groupby排序保留了多个聚合](/upload/InfoBanner/zyjiaocheng/686/a457fce7b2504b88b94c9333397fb731.jpg)
我想在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]
我想按商店和产品分组,同时对销售额进行总计和计数,同时采用评分的平均值.
这很简单:
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
这将返回以下系列:
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个平均评分,而且对这些组本身进行了排序第一类的评分最高,等等.在某种程度上,这只是锦上添花,因为我现在拥有想要的值,并且希望报告更漂亮.
解决方法:
我已经整理好了.我不需要像上面那样索引分组表并执行后续的groupby和sort_values,而是需要将sort_values应用于未索引的DataFrame,指定要显式排序的列:
g = dfg.groupby(level=0, group_keys=False).apply(
lambda x: x.sort_values(('rating', 'mean'), ascending=False).head(2))
给我想要的结果:
内容总结
以上是互联网集市为您收集整理的python-分组内的Pandas groupby排序保留了多个聚合全部内容,希望文章能够帮你解决python-分组内的Pandas groupby排序保留了多个聚合所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。