Существуют ли функции для извлечения счетчиков гистограмм серии в pandas?

Существует метод построения plot гистограмм серии, но есть ли функция для извлечения подсчетов гистограмм для выполнения дальнейших вычислений поверх нее?

Я продолжаю использовать функции numpy для этого и преобразовываю результат в DataFrame или Series, когда мне это нужно. Было бы неплохо оставаться с объектами pandas все время.

Ответы

Ответ 1

Если ваша серия была дискретной, вы можете использовать value_counts:

In [11]: s = pd.Series([1, 1, 2, 1, 2, 2, 3])

In [12]: s.value_counts()
Out[12]:
2    3
1    3
3    1
dtype: int64

Вы можете видеть, что s.hist() по существу эквивалентен s.value_counts().plot().

Если это было из поплавков, ужасное хакерское решение могло бы использовать groupby:

s.groupby(lambda i: np.floor(2*s[i]) / 2).count()

Ответ 2

Так как hist и value_counts не используют индекс Series, вы можете рассматривать серию как обычный массив и использовать np.histogram напрямую. Затем постройте серию из результата.

In [4]: s = Series(randn(100))

In [5]: counts, bins = np.histogram(s)

In [6]: Series(counts, index=bins[:-1])
Out[6]: 
-2.968575     1
-2.355032     4
-1.741488     5
-1.127944    26
-0.514401    23
 0.099143    23
 0.712686    12
 1.326230     5
 1.939773     0
 2.553317     1
dtype: int32

Это действительно удобный способ организовать результат гистограммы для последующего вычисления.

Чтобы индексировать по центру каждого бункера вместо левого края, вы можете использовать bins[:-1] + np.diff(bins)/2.

Ответ 3

Если вы знаете количество требуемых бункеров, вы можете использовать функцию pandas 'cut, которая теперь доступна через value_counts. Используя тот же случайный пример:

s = pd.Series(np.random.randn(100))
s.value_counts(bins=5)

Out[55]: 
(-0.512, 0.311]     40
(0.311, 1.133]      25
(-1.335, -0.512]    14
(1.133, 1.956]      13
(-2.161, -1.335]     8