Вывод Pivot не такой, как ожидалось

#python-3.x #pandas #pivot #pivot-table #transpose

#python-3.x #панды #сводный #сводная таблица #транспонировать

Вопрос:

У меня есть данные, которые уже суммированы и сгруппированы в dataframe с именем df :

 | id | segment | region   | points |
|----|---------|----------|--------|
| 90 | Gold    | APAC     | 21     |
| 90 | Silver  | EMEA     | 34     |
| 90 | Bronze  | AMERICAS | 564    |
| 90 | Gold    | EMEA     | 3939   |
| 90 | Silver  | Americas | 989    |
| 90 | Gold    | EMEA     | 43     |
| 90 | Silver  | APAC     | 13     |
| 90 | Bronze  | AMERICAS | 567    |
 

Я хотел бы повернуть оба segment столбца и region к столбцам, а затем суммировать баллы для этих столбцов. Вывод будет выглядеть так, как показано ниже, на основе ввода выше:

 | id | Gold | Silver | Bronze | APAC | EMEA | AMERICAS |
|----|------|--------|--------|------|------|----------|
| 90 | 4003 | 1036   | 1131   | 34   | 4016 | 2120     |
 

До сих пор я пытался преобразовать мой фрейм данных в Pandas, а затем использовать встроенную pivot_table функцию.

 import pandas as pd
df_pd = df.toPandas()
pd.pivot_table(df_pd, values = 'points', index=['id'], columns = ['segment', 'region']).reset_index()
 

Код работает, но вывод не такой, как ожидалось. Вместо того, чтобы получать итоговые значения для каждого region и segment в виде столбца, я получаю две строки столбцов. Похоже, что в двух строках столбцов это region подгруппа segment . Смотрите ниже (обратите внимание, что числа не совпадают из-за того, что в образце данных используются случайные числа, меня больше беспокоит форма):

введите описание изображения здесь

Ответ №1:

Решение с двойным pivot_table и DataFrame.join :

 df1 = pd.pivot_table(df_pd, values='points', index='id', columns='segment', aggfunc='sum')
df2 = pd.pivot_table(df_pd, values='points', index='id', columns='region', aggfunc='sum')

df = df1.join(df2).reset_index()
print (df)
   id  Bronze  Gold  Silver  AMERICAS  APAC  Americas  EMEA
0  90    1131  4003    1036      1131    34       989  4016
 

В вашем решении возможно добавление sum на первый и на второй уровень MultiIndex in columns с join :

 df3 = pd.pivot_table(df_pd,
                    values = 'points', 
                    index='id', 
                    columns = ['segment', 'region'], 
                    aggfunc='sum')

df = df3.sum(level=0, axis=1).join(df3.sum(level=1, axis=1)).reset_index()
print (df)
   id  Bronze  Gold  Silver  AMERICAS  APAC  EMEA  Americas
0  90    1131  4003    1036      1131    34  4016       989