Сглаженные значения сводной таблицы должны быть рядом друг с другом w.r.t. в столбец - PullRequest
0 голосов
/ 11 июля 2019

После выравнивания я получаю (Завершено, A), (Завершено, B), (Завершено, C), тогда как я хочу, чтобы оно было (Завершено, A), (Not_Completed, A), (Завершено, B), (Not_Completed, B).

x = pd.DataFrame({'P':['A','B', 'C'], 'id' : ['1100', '1101', '1102'], 'Completed' : [10,4,8], 'Not_Completed' : [6,2,2]})


   P    id  Completed  Not_Completed  

0  A    1100         10            6

1  B    1101          4            2

2  C    1102          8            2

x = x.sort_values(by = 'Completed',ascending = False)
x1 = x.pivot_table(index='id', columns=['P'], values=['Completed', 'Not_Completed'], fill_value = 0)
flattened = pd.DataFrame(x1.to_records())
flattened

Фактические столбцы:

id (Completed, A), (Completed, B), (Completed, C), (Not_Completed, A), (Completed, B), (Not_Completed, C)

Ожидаемые столбцы:

id (Completed, A), (Not_Completed, A), (Completed, C), (Not_Completed, C), (Completed, B), (Not_Completed, B)

1 Ответ

0 голосов
/ 11 июля 2019

Вы можете отсортировать столбцы x1 перед выравниванием:

flattened = pd.DataFrame(x1.sort_index(level=1, axis=1)
                           .to_records())
flattened

дает вам то, что вы хотите (учитывая A, B, C в порядке).

В случае, если у вас естьДикт порядка:

orders = {'A':10, 'B':4, 'C':8}

тогда вы можете сортировать столбцы по этому порядку:

cols = sorted(list(x1.columns), 
              key=lambda x: (-orders[x[1]], x[0]) 
             )

flattened = pd.DataFrame(x1[cols].to_records())
...