Pandas在分组和透视中报告前N名

6
我正在尝试通过沿着单个维度d1进行分组并报告每个d1元素的摘要统计信息来总结数据框。特别是我对于许多指标中的前n个(索引和值)感兴趣。
我想为d1的每个元素生成一行。假设我有两个维度d1、d2和4个指标m1、m2、m3、m4。
1) 分组依据d1,找到每个指标m1-m4的前n个d2和指标值的建议方法是什么?
在Wes的书《Python数据分析》第35页中,他建议使用:
def get_top1000(group):
 return group.sort_index(by='births', ascending=False)[:1000]
grouped = names.groupby(['year', 'sex'])
top1000 = grouped.apply(get_top1000)

这还是推荐的方法吗?(我只对前五个 d2 感兴趣,而不是对 1000 个进行分析,并且需要考虑多个度量标准) 2)下一个问题是,我想将前五个 d2(也就是说,我希望每个 d1 元素都有一行)进行透视。

因此,对于维度 d1、d2 和度量标准 m1,结果数据框应该如下所示: 索引为 d1,列为 d2 的前 5 个值和相应的 m1 值

d1 d2-1 d2-2 d2-3 d2-4 d2-5 m1-1 m1-2 m1-3 m1-4 m1-5

......

因此,要进行透视,我必须在 d2 上创建排名(即 1 到 5 - 这是我的列字段)。如果始终有 5 个条目,那么这将很容易,但是对于给定 d1 值的少于 5 个 d2 元素时,做起来会比较棘手。

因此,是否有人能够提供如何将排名添加到分组中的建议,以便我具有进行透视的正确列索引。


你真的应该更好地说明你期望的格式。包括一些虚假数据和你期望的输出。 - Paul H
1个回答

10

我没有任何玩具数据可以使用,也没有期望的结果可以进行比较,但是我认为你想要以下内容:

N = 1000
names = my_fake_data_loader()
grouped = names.groupby(['year', 'sex'])
grouped.apply(lambda g: g.sort_index(by='births', ascending=False).head(N))

这将为每个组的前1000个元素提供。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接