Сортировать pandas сводную таблицу по сумме строк и столбцов - PullRequest
1 голос
/ 20 марта 2020

У меня есть (например) этот 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)

Ответы [ 3 ]

1 голос
/ 20 марта 2020

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 голос
/ 20 марта 2020

Я попробую что-то вроде этого

pivot['sum_cols'] = pivot.sum(axis=1)
pivot = pivot.sort_values('sum_cols' , ascending=False)
0 голосов
/ 20 марта 2020

Индекс вашей сводной таблицы (значения от COLUMN1 и COLUMN2) имеют тип String, а сортировка String выполняется от А до Z. Возможно, вам следует ввести индексы типа Integer и тогда сортировка будет выполнена численно. Принимая во внимание документацию pivot_table Тип целого числа разрешен для columns и index.

df = df.astype('int')

Теперь ваша функция pivot_table выводит DataFrame, который вы можете отсортировать по индексировать или по столбцам аналогично тому, как вы это делаете с любым DataFrame.

Согласно документация sort_index : Для сортировки индекса необходимо выполнить:

pivot = pivot.sort_index(ascending=0)

Для сортировки столбцов необходимо сделать:

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