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

qcut
こつこつPython

この記事の執筆・監修

キノコード
キノコード

テクノロジーアンドデザインカンパニー合同会社のCEO。
日本最大級のプログラミング教育のYouTubeチャンネル「キノコード」や、プログラミング学習サービス「キノクエスト」を運営。
著書「あなたの仕事が一瞬で片付くPythonによる自動化仕事術」や、雑誌「日経ソフトウエア」や「シェルスクリプトマガジン」への寄稿など実績多数。

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

未経験からはじめるPython学習「キノクエスト」 キノクエスト
  • スキルアップしたいけど何からはじめればよいかわからない…
  • プログラミングスクールに入りたいけど料金が高い…
  • プログラミングを学んでも業務やキャリアに活かせるか不安…

キノクエストは、このような悩みを持つ方にぴったりのプログラミング学習サービスです。
国内最大級のプログラミング学習系YouTubeチャンネル「キノコード」が提供しているから、未経験者にもわかりやすく質の高い学習体験を実感していただけます。

キノクエスト