【问题标题】:Sort pandas pivot table by sum of rows and columns按行和列的总和对 pandas 数据透视表进行排序
【发布时间】:2020-03-20 17:27:06
【问题描述】:

我有(例如)这个 DataFrame:

 COLUMN1 COLUMN2  VALUE
0    0102    1020      1
1    0102    1220      8
2    0102    1210      2
3    0103    1020      1
4    0103    1210      3
5    0103    1222      8
6    0104    1020      3
7    0104    1120      2

(实际上,它的长度约为 9000 行。)

由此,我创建了数据透视表,其中索引为 COLUMN1,列为 COLUMN2,值来自 VALUES,由 0 填充,其中 NaN。

COLUMN2  1020  1120  1210  1220  1222
COLUMN1                              
0102        1     0     2     8     0
0103        1     0     3     0     8
0104        3     2     0     0     0

我必须先按总行数对这个枢轴进行排序,然后再按总列数。 看起来像这样:

COLUMN2  1220  1222  1020  1210  1120| (GT)
COLUMN1                              |     HIGHEST
0103        0     8     1     3     0| (12) |
0102        8     0     1     2     0| (11) |
0104        0     0     3     0     2| (5)  V
--------------------------------------
(GT:        8     8     5     5     2)
 HIGHTEST---------------------------->  LOWEST

有没有办法做到这一点? 我曾尝试通过将索引和列作为列表导入来创建数据透视表,并按照我希望它们出现的顺序进行排序,但 pandas 在创建表时似乎会自动对它们进行排序。

示例代码:

import pandas as pd

exampledata=[['0102','1020',1],['0102','1220',8],['0102','1210',2],
             ['0103','1020',1],['0103','1210',3], ['0103','1222',8],
             ['0104','1020',3],['0104','1120',2]]

df = pd.DataFrame(exampledata,columns=['COLUMN1','COLUMN2','VALUE'])
print(df)
pivot = pd.pivot_table(df,
                       index='COLUMN1',
                       columns='COLUMN2',
                       values='VALUE',
                       aggfunc='sum',
                       fill_value=0)
print(pivot)

【问题讨论】:

    标签: python pandas pivot-table


    【解决方案1】:

    pivot_table 有一个选项margin,这对这种情况很方便:

    (df.pivot_table(index='COLUMN1', columns='COLUMN2', values='VALUE',
                   aggfunc='sum', fill_value=0, margins=True)   # pivot with margins 
       .sort_values('All', ascending=False)  # sort by row sum
       .drop('All', axis=1)                  # drop column `All`
       .sort_values('All', ascending=False, axis=1) # sort by column sum
       .drop('All')    # drop row `All`
    )
    

    输出:

    COLUMN2  1220  1222  1020  1210  1120
    COLUMN1                              
    103         0     8     1     3     0
    102         8     0     1     2     0
    104         0     0     3     0     2
    

    【讨论】:

    • 不错,这个解决方案不是求和,而是利用枢轴+1下内置的边距选项
    • 正是我要找的东西,而且效果很好。非常感谢!
    • 谢谢,那些axis 参数对我帮助很大!
    【解决方案2】:

    我会尝试这样的事情

    pivot['sum_cols'] = pivot.sum(axis=1)
    pivot = pivot.sort_values('sum_cols' , ascending=False)
    

    【讨论】:

      【解决方案3】:

      您的数据透视表的索引(来自COLUMN1COLUMN2 的值)属于String 类型,并且String 的排序是从A 到Z 完成的。也许您应该输入Integer 类型的索引,然后排序将以数字方式进行。考虑到pivot_table documentation 整数类型允许用于columnsindex

      df = df.astype('int')
      

      现在,您的pivot_table 函数输出一个DataFrame,您可以按照与任何DataFrame 相同的方式按索引或按列排序。

      根据sort_index documentation: 要对索引进行排序,您应该这样做:

      pivot = pivot.sort_index(ascending=0)
      

      要对列进行排序,您应该这样做:

      pivot = pivot.sort_index(axis=1, ascending=0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-09
        • 2020-06-16
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2018-09-25
        • 1970-01-01
        • 2019-06-15
        相关资源
        最近更新 更多