web-dev-qa-db-ja.com

パンダのシリーズのヒストグラムカウントを取得する関数はありますか?

plot系列ヒストグラムを作成する方法はありますが、ヒストグラムカウントを取得して、さらに計算を行う関数はありますか?

私はこれを行うためにnumpyの関数を使い続け、これが必要なときに結果をDataFrameまたはSeriesに変換します。ずっとpandasオブジェクトと一緒にいるといいでしょう。

17

シリーズが離散的である場合は、 _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()
_
12
Andy Hayden

histと_value_counts_はシリーズのインデックスを使用しないため、シリーズを通常の配列のように扱い、_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
_

これは、後続の計算のためにヒストグラムの結果を整理するための非常に便利な方法です。

左端ではなく各ビンのcenterでインデックスを作成するには、bins[:-1] + np.diff(bins)/2を使用できます。

12
Dan Allan

必要なビンの数がわかっている場合は、パンダの 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
3
IanS