>100 Views
September 07, 23
スライド概要
Section 18では、データの変数を分割する「ビニング処理」を解説しましたが、このセクションでは、 そのビン(分割区分)に付けたラベルを元データに付与する方法を解説します。
元データに、新たなデータ項目を追加することにより、分析の幅が広がりますので、今回のスキルをしっかりとマスターしましょう。このプログラムは、機械学習用のデータを作成するときにもよく使うものです。
それらを実現するプログラムは下記の2つです。
㊾ 新データ名 = 元データ名.copy()
㊿ 新データ名[“新列名”] = pd.cut(元データ名[“列名”]
, [数字1, 数字2, 数字3]
, labels=[ラベル1, ラベル2, ラベル3] )
また、Pythonのプログラムを書く際に犯してしまうミスを警告してくれるコラボの機能「SettingWithCopyWarning」を体験し、それを防ぐ方法も身に付けていきましょう!
1st STEP同様、動画のテキスト、追加情報は下記のブログを参考にしてください!
■この動画のブログ
データサイエンス チュートリアル
https://tutorial4datascience.blogspot.com/
■参考URL
●理解を深めるため、ブログ「naoの学習&学習」の「【Pandas】 データフレームをコピーしたいときにcopy()を使う意味」のURLをブログに貼り付けておきますので余力のある方は一読してみてください。
https://www.learning-nao.com/?p=2384
1 2nd STEP 集計とグラフ描画 Section 19 ビンのラベルを元のデータに付与する ㊾ 新データ名 = 元データ名.copy() ㊿ 新データ名[“新列名”] = pd.cut( 元データ名[“列名”], [数字1, 数字2, 数字3] , labels=[ラベル1, ラベル2, ラベル3] )
2 Section 19 ビンのラベルを元のデータに付与する 1.ビンのラベルを元のデータに付与する ㊽で求めたビンのラベルを元データ「id_pos7」に付与しましょう。 列の追加は、Section 15の㉛の応用です。 ㉛ データ名[“新列名”] = データ名[“列名1”] * データ名[“列名2”] ㊽で求めたラベルはインデックスとラベルからなるリストですから、データ名[“新列名”] を「=」 で㊽とつなげると何とかなりそうです。やってみましょう。
3 Section 19 ビンのラベルを元のデータに付与する 2.SettingWithCopyWarning id_pos7["価格帯"] = pd.cut(id_pos7["UnitPrice"], [0, 5, 10, 15, 20, 25] , labels=["-5", "5-10", "10-15", "15-20", "25-"]) と記入すると、なにやら・・・ SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead という警告が出てしまいます。これは、エラーではなく警告なので処理が止まることはないの ですが、放置しておくと気づかないうちに予期せぬ結果になってしまう場合があります。 この原因は、「id_pos7」の追加する新たな列「価格帯」が、 同じ「id_pos7」を処理した (ビニングした)ものだからです。 今回は新たな列を追加するので、結果に影響を与えないのですが、警告に従ってプログラ ムを書き直していきます。
4 Section 19 ビンのラベルを元のデータに付与する 3.「.copy()」を使う 新たな列「価格帯」 を追加するデータ名を「id_pos7」以外の名前で宣言して、 「.copy()」を 使い「id_pos7」のデータの値が同じものにします。 ㊾ 新データ名 = 元データ名.copy() 一見、「id_pos7_2 = id_pos7」でも良さそうなのですが、こうすると「 id_pos7_2」に変更を加 えると、元の「id_pos7」にも変更が適用されてしまいます。 これでは、のちにグラフを描く等「id_pos7」を使う際、混乱してしまいます。元のデータも保持し ておきたい場合は、copy()を使ってコピーするようにしましょう。 ㊾は「値渡し」、 「id_pos7_2 = id_pos7」は「参照渡し」と言います。 理解を深めるために余力のある方は一読してみてください。 https://www.learning-nao.com/?p=2384 さあ、下記のプログラムを試してみましょう。今度は警告が出ないはずです。 ㊿ 新データ名[“新列名”] = pd.cut( 元データ名[“列名”], [数字1, 数字2, 数字3] , labels=[ラベル1, ラベル2, ラベル3] )
5 Section 19 ビンのラベルを元のデータに付与する ㊾ ㊿ ㊾、㊿を使うことにより、「id_pos7」にビンのラベルを付与した「id_pos7_2」ができました。 今度は、警告が出ませんでしたね。