質問: DataFrame(attri_data1) pd.cut(attri_data_frame1.ID, 2) ``` 上を実行した結果、下のようになりました。 Out[1]: 0 (99.987, 106.5] 1 (99.987, 106.5] 2 (99.987, 106.5] 3 (99.987, 106.5] 4 (99.987, 106.5] 5 (99.987, 106.5] 6 (106.5, 113.0] 7 (106.5, 113.0] 8 (106.5, 113.0] 9 (106.5, 113.0] Name: ID, dtype: category Categories (2, interval[float64]): [(99.987, 106.5] < (106.5, 113.0]]
回答: とりあえず質問のコードをもとに簡単に説明を。 質問のコード上では ID の値は 最小値 : 100 最大値 : 113 となっております。 現状のコードでは `pandas.cut(bins=2)` となっており、IDを2つのカテゴリーに分けるよう指示されておりますので、IDの最大値と最小値の中間の値 `106.5` 境に2分割し * IDが106.5以下の場合 : 1つ目のカテゴリー `(99.987, 106.5]` * IDが106.5より大きい場合 : 2つ目のカテゴリー `(106.5, 113.0]` として、各IDの値がどちらのカテゴリーに属するかを返します。 ここで表記の括弧ですが、これはその値を含むか否か - 含む場合大括弧`[]` 含まない場合は小括弧`()` - で記述されています。 > > `pandas.cut()`のデフォルト動作としては右側の値(大きい方の値)を**含む**ようにカテゴリー分けします。右側の値を**含まない** ようにカテゴリー分けしたい場合は `right=False` パラメータを設定してください。 > > > ~~ただ、これらの表記は「このカテゴリーは何なのか」を示す**単なる表記** ですのでそれほど気にする必要はないのかなと個人的には思います。~~ 単にカテゴリ分けした結果だけが欲しい場合は`pandas.cut()`のパラメータに `labels=False` を渡してください。1つ目のカテゴリーに属する場合は`0`を、1つ目のカテゴリーに属する場合は`1`を返すようになります。 またここで、1つ目のカテゴリーの左側の値(小さい方の値)が `99.987` となっているのは、IDの最小値`100` を1つ目のカテゴリーとして扱う為に設定されている(pandas内部で何かしらの計算で自動的に算出された)値ですので、こちらもあまり気にする必用はありません。 あと、IDの値の最大値と最小値の中間点ではなく、明示的な値でデータを分割したい場合は、`bins` パラメータに`数値(分割数)` ではなく `数値のリスト` を渡します。例えば * 0より大きく108以下の場合 : 1つ目のカテゴリー * 108より大きく200以下の場合 : 2つ目のカテゴリー として分割したい場合は、`pandas.cut(bins=[0,108,200])` などと書きます。この場合どちらにも属さないIDがあった場合`NaN`を返しますのでご注意ください。 **【補足】** 不正確な記述をしていたので補足 pandas には `pandas.interval`という区間を表すオブジェクトがあるようです。 で、`pandas.cut()`はどの intervalオブジェクトに属しているかでカテゴリー分けしているようです ですので、`(99.987, 106.5]` のような記述は **「単なる表記」** ではなく、**「どのintervalオブジェクトに属しているか」**という意味合いになりますね。