Pandas pivot_table несколько aggfunc с полями

Я заметил, что не могу установить margins=True при наличии нескольких aggfunc, таких как ("count", "mean", "sum").

Будет рвота KeyError: 'Level None not found'

Это пример кода.

df.pivot_table(values=A,index=[B,C,D],columns=E,aggfunc=("count","mean","sum"),
margins=True,margins_name="Total",fill_value=0)

Обновление:

Это образец ДФ:

[{'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 1, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 1, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 1, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'}]

И код выдает ошибки.

df.pivot_table(values="Results",index="Game_ID",
columns="Team",aggfunc=("count","mean","sum"),margins=True)

person user12164    schedule 26.08.2017    source источник
comment
Не могли бы вы предоставить свой df, чтобы мы могли протестировать код   -  person 2Obe    schedule 27.08.2017
comment
Спасибо за ваш ответ, я обновил вопрос с образцом кадра.   -  person user12164    schedule 28.08.2017
comment
У меня была одна и та же проблема с каждым df, с которым я работал в последние недели.   -  person Touri    schedule 28.11.2017


Ответы (1)


Я вижу ошибку, о которой вы говорите. Я обошел это, используя вызовы функций вместо строковых имен «count», «mean» и «sum».

Сначала мы начнем с вашего фрейма данных:

import pandas as pd

df=pd.DataFrame([{'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 1, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'},
 {'Game_ID': 'no.1', 'Results': 1, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 1, 'Team': 'A'},
 {'Game_ID': 'no.1', 'Results': 0, 'Team': 'B'}])

Затем просто замените агрегатные функции вызовом стандартной библиотеки на len и агрегатными функциями numpy.

  • "количество" становится len
  • "среднее" становится np.mean
  • "сумма" становится np.sum

Сводная таблица состоит из следующих строк:

import numpy as np
df.pivot_table(values="Results",
               index="Game_ID",
               columns="Team",
               aggfunc=[len,np.mean,np.sum],
               margins=True)

Вывод сводной таблицы

Обратите внимание, что len может быть не тем, что вам нужно, но в этом примере он дает тот же ответ, что и "count" сам по себе. Посмотрите, например, на numpy.count_nonzero.

person Dan Fiorino    schedule 28.03.2018