【问题标题】:Sort Pandas Pivot Table by the margin ('All') values column按边距(“全部”)值列对 Pandas 数据透视表进行排序
【发布时间】:2016-06-09 16:49:45
【问题描述】:

我正在尝试通过 pandas 数据透视表中的行总和对最后一列/边距/aggrfunc 进行降序排序。我知道我在这里遗漏了一些简单的东西,但我无法弄清楚。

数据框/数据透视表:

WIDGETS         
DATE    2/1/16  2/2/16  2/3/16  All
NAME                
PERSON1 43      5               48
PERSON2         4       7       11
PERSON3         56      143     199

我需要它做的也是按 aggfunc/margins 排序:

WIDGETS         
DATE    2/1/16  2/2/16  2/3/16  All
NAME                
PERSON3         56      143     199
PERSON1 43      5               48
PERSON2         4       7       11

pt = pd.pivot_table(df,values=['WIDGETS'],index=['NAME'],columns=['DATE'],aggfunc=len,fill_value='',margins=True,margins_name='WIDGETS')
pt.sort_values(by='WIDGETS',ascending=False,inplace=True)

错误: ValueError:无法在需要明确提供所有级别的多索引中按列 WIDGETS 排序

建议?

【问题讨论】:

    标签: python pandas dataframe pivot-table


    【解决方案1】:

    你可以在函数sort_values和参数ascending中使用元组:

    print pt
            WIDGETS                  
    DATE     2/1/16 2/2/16 2/3/16 All
    NAME                             
    PERSON1       1      2          3
    PERSON2       2      4      3   9
    PERSON3       1             1   2
    All           4      6      4  14
    
    pt.sort_values(by=('WIDGETS', 'All'), ascending=False,inplace=True)
    print pt
            WIDGETS                  
    DATE     2/1/16 2/2/16 2/3/16 All
    NAME                             
    All           4      6      4  14
    PERSON2       2      4      3   9
    PERSON1       1      2          3
    PERSON3       1             1   2
    

    【讨论】:

    • 谢谢!这让我走上了正确的道路,我必须进行 2 处更改:将所有内容添加到 sort_values,如您上面建议的那样,并将 margins_name='WIDGETS' 更改为 margins_name='All'。做到了!
    • 可以,也可以省略margins_name,因为默认是All
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多