シリーズ ヒストグラムをプロットする方法はありますが、ヒストグラム カウントを取得してさらに計算を行う関数はありますか?
これを行うためにnumpyの関数を使用し続け、必要に応じて結果をDataFrameまたはSeriesに変換します。pandas のオブジェクトを常に使用できると便利です。
シリーズが個別の場合は、次を使用できます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()
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
これは、後続の計算のためにヒストグラムの結果を整理するための非常に便利な方法です。
左端ではなく各ビンの中心で索引付けするには、 を使用できますbins[:-1] + np.diff(bins)/2
。
必要なビンの数がわかっている場合は、 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
関連する質問からのこの回答に基づいて、次のようにビンのエッジとヒストグラムの数を取得できます。
s = pd.Series(np.random.randn(100))
ax = s.hist()
for rect in dd.patches:
((x0, y0), (x1, y1)) = rect.get_bbox().get_points()
print(((x0, y0), (x1, y1)))