Pandasについてシリーズで記事を書いています。
今回は第19回目になります。
今回の記事では、ディズニー映画のCSVデータを使って
- 特定のセルの値を新しい値に書き換える方法
- 特定のコラムの中のある値全てを新しい値に書き換える方法
- SettingWithCopyWarningが出た時の対処法
を書いていきます。
ではさっそく始めていきますね。
今回使うデータ
kaggle.comさんのサイトのなかのディズニー映画に関するデータを使います
.read_csv()で読み込むと下記のようになります
デフォルトでは、インデックスは数字になっているので、映画のタイトルのコラム(movie_titleと名前が付けられているコラム)をインデックスにします
※特定のコラムをインデックスにする方法が分からない方は、こちらの記事を参考にどうぞ。
では特定のセルの値を変えるには、まず大前提として特定のセルを指定しなければなりません。
そのセルの指定の仕方を下記に書いていきます。
loc[]を使い、特定のセルを指定する
※.loc[]の使い方の詳しい事は前回の記事に書いています
.loc[]で特定のセルを指定するには、上記に記載しているように、
最初の引数にインデックス名、2番目の引数にコラム名
を書きます。
その2つが交わった部分のセルが指定されます。
では、
今回使うデータの『Cinderella』『genre』が交わる、『Drama』という値を書き換えてみましょう
『Drama』を『Drama movie』に書き換えます
disney.loc["Cinderella","genre"] = "Drama movie"
.loc[] にインデックス名とコラム名を引数に入れ指定した特定のセルに"Drama movie" を代入しました。
では、genreコラムにある、他のDramaの値もDrama movieに書き換えるにはどうしたら良いでしょうか?
下記に続きます
コラム内にある特定の値全てを書き換える
今回のデータのコラムgenre にあるDramaという値を全てDrama movie に変える方法を失敗方法も含めて書いていきます。
仮定1 booleanを使ってはじき出したrowに新しく書き換えたい値を直接代入する
結果➡『SettingWithCopyWarning』が出ます
解決法を後述します
df[ "コラム名" ] で特定のコラム一列が特定されますよね。
そのコラムで特定の値と等しい物を表すには
df[ "コラム名" ] == (等しいか比べたい値)
例えばheight(身長)コラムの中で167になっている部分を探したい時は
df["height"] == 167
とします。すると、167に一致する部分はTrue それ以外はFalse としてbooleanで返されます。
DataFrame のなかでTrue になっているrow のみを取り出したいので、
df[ df["height"] == 167 ]
とコードを書くと、height が167になっているrow のみが全てはじき出されるというロジックです。
genreの値がDrama になったrowのみでできたDataFrame をつかって、Drama という値をDrama movieに書き換えることができるか実験してみます。
disney[ disney["genre"] == "Drama"][ "genre" ] = "Drama movie"
上記のコードが正しいコードか見てみます
すると下記のようなエラーが出ました。
簡単に翻訳しますと、
データフレームから取り出したスライスのコピーに対して、値を設定しようとしています。
代わりに.loc[] を使ってみてください。
disney[ disney["genre"] == "Drama"]はオリジナルのデータに影響するものではなく、新しく作られたコピーであるということですね。
Pandasを使っているとよく遭遇する『Setting With Copy Warning』の正体を簡単に説明すると、コピーに値を設定しようとしていますよということです。
では、提案通りに.loc[] を使ってみます。
.loc[] を使って特定のセルの値を書き換える
.loc[]の引数は、
第1引数がインデックス名で、第2引数がコラム名。
それなのに、どのようにしてコラム内にある特定の値全てを変えることができるの?
という疑問がわいてくると思います
Pandasドキュメントを再度確認してみます。
引用元:Pandasドキュメント
するとbooleanも使えると書いています
上記が.loc[]によって特定の値全てを新しい値に変える方法になります。
全てのDramaという値が、Drama movie に書き換えられました。
まとめ
今回の記事はこれくらいで終わりにしようと思います
また引き続きPandasの使い方の記事を書いていきますね。