Панды Иерархических операций

#python #pandas #pandas-groupby #multi-index

Вопрос:

Очевидно, мне не хватает чего-то простого, но я не знаю чего. Я хотел бы распространить операцию по группам. Скажем что-нибудь простое, у меня есть простой ряд с несколькими индексами (скажем, 2 уровня), я хочу взять среднее значение и вычесть это среднее значение до правильного уровня индекса.

Минималистский пример кода:

 a = pd.Series({(2,1): 3., (1,2):4.,(2,3):4.})
b = a.groupby(level=0).mean()
r = a-b # this is the wrong line, b doesn't propagate to the multiindex of a
 

Результат, которого я ожидаю:

 2  1    -0.5
1  2    0
2  3    .5
dtype: float64
 

Ответ №1:

Используйте Series.sub с возможным заданным уровнем для выравнивания:

 r = a.sub(b, level=0)
print (r)
2  1   -0.5
1  2    0.0
2  3    0.5
dtype: float64
 

Или используйте GroupBy.transform для Series с тем же индексом, что и оригинал a Series :

 b = a.groupby(level=0).transform('mean')
r = a-b
print (r)
2  1   -0.5
1  2    0.0
2  3    0.5
dtype: float64
 

Комментарии:

1. кстати @jezrael, мне, возможно, потребуется задать еще один вопрос, но, скажем, результат b также многоуровневый (например, если a у него 3 уровня и b 2 уровня, потому b= a.groupby(level=[0,1]).mean() что), это, похоже, больше не работает. Если я недостаточно ясен, я либо обновляю свой вопрос, либо публикую новый. Но то, чего я ожидал бы, было бы чем-то вроде r = a.sub(b, level=[0,1]) того, что, похоже, не работает. Я получаю TypeError: Join on level between two MultiIndex objects is ambiguous

2. хорошо, не проверял свой 2-й пример с transform функцией, вот что работает в этом случае =)