【毎日Python】Pythonでデータを同じ数でビン分割する方法|pandas.qcut

import pandas as pd

Pythonで、同じ個数で配列をビン分割する方法です。
使用するのは、Pythonのpandasライブラリのcutメソッドです。
ビン分割とは、配列の各要素を最小と最大の境界値で区切り、カテゴリ分けする操作のことです。

ser = pd.Series([11, 46, 65, 34,
                 25, 12, 35, 79])
ser
pd.qcut(ser, q=4)

このようなシリーズを用意します。
qcutの第一引数にシリーズの変数名、第二引数ビン分割する数を指定します。
引数のqは省略可能ですが、今回は指定して実行します。
4つのカテゴリに分けて、同じ個数でビン分割することができました。
デフォルトでは、最小値である左側の境界値は含まれず、最大値である右側の境界値は含まれるようになっています。
例えば、11は10.999より大きく、28以下というカテゴリに分割されます。 

pd.qcut(ser, 4).value_counts()

なお、value_countsメソッドを使用すると、同じ個数でビン分割されているかを確認することができます。
それぞれ4つのカテゴリが2個ずつ作成されていることが確認できました。

pd.qcut(ser, 4, retbins=True)

それぞれの境界値を、配列で取得することもできます。
引数retbinsにTrueを指定します。
実行します。
境界値も併せて取得することができました。

pd.qcut(ser, 4, labels=['tiny', 'small', 
                        'medium','big'])

また、ビン分割する値にラベルを指定することもできます。
引数にlabelsで、ラベルにしたい値をリストで指定します。
実行します。
ラベルで表示することができました。

なお、同じようにビン分割を行うメソッドで、cutメソッドがあります。
cutメソッドでは、このように作成されるビンの個数はそれぞれ異なります。
また、同じ間隔でそれぞれのビンが分割されたり、境界値をリストで指定できたりする点が主な違いです。

pd.cut(ser, 4).value_counts()
pd.cut(ser, [10, 15, 55, 95])

関連メソッド

【毎日Python】Pythonでデータを等間隔のビンに分割する方法|pandas.cut