#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