【Pandas・DataFrame】コラムの値・複数の値を書き換える(ディズニー映画のデータ使用)　no.19

![見出しを追加 (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/1b08d35a-2788-76e0-b27e-dba191df975e.png)
こんにちは、まゆみです。

Pandasについてシリーズで記事を書いています。

今回は第19回目になります。

今回の記事では、[ディズニー映画のCSVデータ](https://www.kaggle.com/prateekmaj21/disney-movies)を使って

<ul>
<li>特定のセルの値を新しい値に書き換える方法</li>
<li>特定のコラムの中のある値全てを新しい値に書き換える方法</li>
<li>SettingWithCopyWarningが出た時の対処法</li>
</ul>

を書いていきます。

ではさっそく始めていきますね。

#今回使うデータ

[kaggle.com](https://www.kaggle.com/)さんのサイトのなかの[ディズニー映画に関するデータ](https://www.kaggle.com/prateekmaj21/disney-movies)を使います

.read_csv()で読み込むと下記のようになります

![スクリーンショット 2021-03-24 084555.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/2a8b798e-469a-ee91-243b-bb388cb4d5f0.jpeg)

デフォルトでは、インデックスは数字になっているので、<font color="Red">映画のタイトルのコラム(movie_titleと名前が付けられているコラム)をインデックスにします</font>
※特定のコラムをインデックスにする方法が分からない方は、[こちらの記事](https://qiita.com/Mayumi_Pythonista/items/6bae214755dfeb8d7353#dataframe%E3%81%AE%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%B3%E3%83%A9%E3%83%A0%E3%82%92%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AB%E3%81%99%E3%82%8B)を参考にどうぞ。

![スクリーンショット 2021-03-24 084931.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/2760c213-3095-3791-b710-ed97dfab3792.jpeg)

では特定のセルの値を変えるには、まず大前提として特定のセルを指定しなければなりません。

そのセルの指定の仕方を下記に書いていきます。

#loc[]を使い、特定のセルを指定する
※.loc[]の使い方の詳しい事は[前回の記事](https://qiita.com/Mayumi_Pythonista/items/6bae214755dfeb8d7353)に書いています
![dataframe.loc[ _インデックス名_,_コラム名_].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/bdc58dad-27a9-b1cc-c925-1afda9355e29.png)
.loc[]で特定のセルを指定するには、上記に記載しているように、

>最初の引数にインデックス名、2番目の引数にコラム名

を書きます。

その２つが交わった部分のセルが指定されます。

![data.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/cb5fe3d4-3e5e-6912-ee99-e81405094a93.jpeg)

では、

今回使うデータの『Cinderella』『genre』が交わる、『Drama』という値を書き換えてみましょう


『Drama』を『Drama movie』に書き換えます

```
disney.loc["Cinderella","genre"] = "Drama movie"
```

.loc[] にインデックス名とコラム名を引数に入れ指定した特定のセルに"Drama movie" を代入しました。

実行結果は下記のようになります
![スクリーンショット 2021-03-24 091127.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/93c178e4-aaa7-3b4d-7402-9a50720c9c57.jpeg)

では、genreコラムにある、他のDramaの値もDrama movieに書き換えるにはどうしたら良いでしょうか？

下記に続きます

#コラム内にある特定の値全てを書き換える
今回のデータのコラムgenre にあるDramaという値を全てDrama movie に変える方法を<font color="Red">失敗方法も含めて</font>書いていきます。

##仮定１ booleanを使ってはじき出したrowに新しく書き換えたい値を直接代入する
結果➡『SettingWithCopyWarning』が出ます
解決法を後述します

![本文を追加 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/efb9f91f-9e00-7b9d-9962-01a410e799a6.png)
※以下df = DataFrame を表す


df[ "コラム名" ] で特定のコラム一列が特定されますよね。

そのコラムで特定の値と等しい物を表すには

df[ "コラム名" ] == (等しいか比べたい値)

例えばheight(身長)コラムの中で167になっている部分を探したい時は

df["height"] == 167

とします。すると、167に一致する部分はTrue それ以外はFalse としてbooleanで返されます。

DataFrame のなかでTrue になっているrow のみを取り出したいので、

df[ df["height"] == 167 ]

とコードを書くと、height が167になっているrow のみが全てはじき出されるというロジックです。

![スクリーンショット 2021-03-24 100422.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/2973eb7f-f946-0acf-c942-a10f07a8ba2c.jpeg)

genreの値がDrama になったrowのみでできたDataFrame をつかって、Drama という値をDrama movieに書き換えることができるか実験してみます。


```
disney[ disney["genre"] == "Drama"][ "genre" ] = "Drama movie"
```
上記のコードが正しいコードか見てみます

すると下記のようなエラーが出ました。

![スクリーンショット 2021-03-24 101207.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/61a8b542-69e8-4b3a-7322-5ccdba6c7f25.jpeg)

簡単に翻訳しますと、

>データフレームから取り出したスライスのコピーに対して、値を設定しようとしています。

>代わりに.loc[] を使ってみてください。

disney[ disney["genre"] == "Drama"]はオリジナルのデータに影響するものではなく、新しく作られたコピーであるということですね。
Pandasを使っているとよく遭遇する『Setting With Copy Warning』の正体を簡単に説明すると、コピーに値を設定しようとしていますよということです。


では、<font color="Red">提案通りに.loc[] を使ってみます。</font>

#.loc[] を使って特定のセルの値を書き換える

.loc[]の引数は、

第１引数がインデックス名で、第2引数がコラム名。

それなのに、<font color="Red">どのようにしてコラム内にある特定の値全てを変えることができるの？</font>

という疑問がわいてくると思います


Pandasドキュメントを再度確認してみます。

![スクリーンショット 2021-03-24 103158.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0dfcf85d-30cf-a1cc-0bb8-4d82e6a99f7f.jpeg)
引用元：[Pandasドキュメント](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html)

するとbooleanも使えると書いています

![df.loc[ boolean, _コラム名_].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/3ab024c2-e8c7-d666-d706-435af4b8b230.png)

上記が.loc[]によって特定の値全てを新しい値に変える方法になります。

![スクリーンショット 2021-03-24 105145.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/8974d31a-3c2f-fb9b-39e2-3b115cb3a9fb.jpeg)

全てのDramaという値が、Drama movie に書き換えられました。

#まとめ

今回の記事はこれくらいで終わりにしようと思います

また引き続きPandasの使い方の記事を書いていきますね。