繁体   English   中英

如何在索引的每个级别按agg ='sum'的总数对多索引熊猫数据框数据透视表进行排序

[英]How to sort a multiindex pandas dataframe pivot table by the totals of an agg='sum' at each level of the index

示例生成类似

df = pd.pivot_table(df, index=['name1','name2','name3'], values='total', aggfunc='sum')

最初没有逻辑排序

name1  name2  name3  total
Bob    Mario  Luigi  5
       John   Dan    16
Dave   Tom    Jim    2
              Joe    6
              Jack   3
       Jill   Frank  6  
              Kevin  7

应该成为

name1  name2  name3  total
Dave   Jill   Kevin  7
              Frank  6  
       Tom    Joe    6
              Jack   3
              Jim    2
Bob    John   Dan    16 
       Mario  Luigi  5

Dave之所以排名靠前,是因为他的“ total”(总数)比Bob的21高。它也传播到每个后续索引,因此Jill的13> Tom的11等。 ()并确定我真的不知道自己在做什么。

您可以做的是创建其他列,然后进行多列排序。 对于其他列, transform将返回一个序列,其索引与df对齐,因此您可以将其添加为新列:

from pandas import DataFrame
mydf = DataFrame({"name1":\
["bob","bob","dave","dave","dave","dave","dave"],"name2":\
["mario","john","tom","tom","tom","jill","jill"],"name3":\
["luigi","dan","jim","joe","jack","frank","kevin"],"total":[5,16,2,6,3,6,7]})
mydf["tot1"]=mydf["total"].groupby(mydf["name1"]).transform(sum)
mydf["tot2"]=mydf["total"].groupby(mydf["name2"]).transform(sum)
mydf["tot3"]=mydf["total"].groupby(mydf["name3"]).transform(sum)
mydf.sort_values(by=["tot1","tot2","tot3"],ascending=[False,False,False])

产生:

   name1  name2  name3  total  tot1  tot2  tot3
6  dave   jill  kevin      7    24    13     7
5  dave   jill  frank      6    24    13     6
3  dave    tom    joe      6    24    11     6
4  dave    tom   jack      3    24    11     3
2  dave    tom    jim      2    24    11     2
1   bob   john    dan     16    21    16    16
0   bob  mario  luigi      5    21     5     5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM