#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>