функциональность «Groupby» по индексу `static_frame.Серия `

#python #static-frame

#python #статический фрейм

Вопрос:

У меня есть static_frame.Series , например, так:

 import static_frame as sf
import numpy as np

colors = ('red', 'green')
shapes = ('square', 'circle', 'triangle')

series = sf.Series(np.arange(6), index=sf.IndexHierarchy.from_product(shapes, colors))
  

Я хочу иметь возможность выполнять некоторую функцию «groupby», например, суммировать все значения like-color вместе. С помощью a pandas.Series я мог бы сделать это:

 agg_series = series.groupby(level=1).sum()
  

Как мне сделать то же самое с static_frame ?

Я просмотрел функции группового итератора, но они не позволяют группировать по уровням иерархии индексов. Вероятно, я мог бы превратить это в a sf.Frame , сгруппировать по столбцам индекса, а затем преобразовать обратно в a sf.Series ; но это требует больших усилий, особенно по сравнению с приведенным выше pandas эквивалентом.

Если нет простого способа сделать это, я опубликую его как запрос функции на GitHub.

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

1. (Извините за тег «pandas»; У меня нет необходимой репутации 1500, чтобы создать новый тег для «static_frame». Кто-нибудь, пожалуйста, исправьте это.)

2. @ayhan спасибо за тег!

Ответ №1:

Это можно сделать с помощью нового типа группового итератора, который поддерживает как групповую итерацию на основе значений индекса, так и применение функций к этим группам. (Это было выпущено со статическим фреймом 0.3.1, автором которого я являюсь.)

С помощью an IndexHierarchy можно использовать как отдельные целые числа, так и итерацию целых чисел для выбора одного или нескольких уровней индекса для группировки.

Смотрите пример здесь:

 >>> colors = ('red', 'green') 
>>> shapes = ('square', 'circle', 'triangle')
>>> s1 = sf.Series(range(6), index=sf.IndexHierarchy.from_product(shapes, colors))
>>> s1
<Series>
<IndexHierarchy>
square           red   0
square           green 1
circle           red   2
circle           green 3
triangle         red   4
triangle         green 5
<<U8>            <<U8> <int64>

>>> s1.iter_group_index(0).apply(np.sum)
<Series>
<Index>
circle   5
square   1
triangle 9
<<U8>    <int64>

>>> s1.iter_group_index(1).apply(np.sum)
<Series>
<Index>
green    9
red      6
<<U5>    <int64>