簡體   English   中英

按行和列的總和對熊貓數據透視表進行排序

[英]Sort pandas pivot table by sum of rows and columns

我有(例如)這個 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 在創建表時似乎會自動對它們進行 AZ 排序。

示例代碼:

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)

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

我會嘗試這樣的事情

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

您的數據透視表的索引(從值COLUMN1COLUMN2 )的類型為String ,並且排序String從A做Z.也許你應該輸入索引Integer類型,則排序將數字進行。 考慮到pivot_table 文檔columnsindex允許使用整數類型。

df = df.astype('int')

現在,您的pivot_table函數輸出一個DataFrame ,您可以按照與任何DataFrame相同的方式按索引或按列對其進行DataFrame

根據sort_index 文檔:要對索引進行排序,您應該執行以下操作:

pivot = pivot.sort_index(ascending=0)

要對列進行排序,您應該執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM