Существуют ли функции для извлечения счетчиков гистограмм серии в 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