0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

見出しを追加 (46).png
こんにちは、まゆみです。

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

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

今回の記事では、ディズニー映画のCSVデータを使って

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

を書いていきます。

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

今回使うデータ

kaggle.comさんのサイトのなかのディズニー映画に関するデータを使います

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

スクリーンショット 2021-03-24 084555.jpg

デフォルトでは、インデックスは数字になっているので、映画のタイトルのコラム(movie_titleと名前が付けられているコラム)をインデックスにします
※特定のコラムをインデックスにする方法が分からない方は、こちらの記事を参考にどうぞ。

スクリーンショット 2021-03-24 084931.jpg

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

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

loc[]を使い、特定のセルを指定する

※.loc[]の使い方の詳しい事は前回の記事に書いています
dataframe.loc[ インデックス名,コラム名].png
.loc[]で特定のセルを指定するには、上記に記載しているように、

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

を書きます。

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

data.jpg

では、

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

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

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

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

実行結果は下記のようになります
スクリーンショット 2021-03-24 091127.jpg

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

下記に続きます

コラム内にある特定の値全てを書き換える

今回のデータのコラムgenre にあるDramaという値を全てDrama movie に変える方法を失敗方法も含めて書いていきます。

仮定1 booleanを使ってはじき出したrowに新しく書き換えたい値を直接代入する

結果➡『SettingWithCopyWarning』が出ます
解決法を後述します

本文を追加 (8).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

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

disney[ disney["genre"] == "Drama"][ "genre" ] = "Drama movie"

上記のコードが正しいコードか見てみます

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

スクリーンショット 2021-03-24 101207.jpg

簡単に翻訳しますと、

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

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

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

では、提案通りに.loc[] を使ってみます。

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

.loc[]の引数は、

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

それなのに、どのようにしてコラム内にある特定の値全てを変えることができるの?

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

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

スクリーンショット 2021-03-24 103158.jpg
引用元:Pandasドキュメント

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

df.loc[ boolean, コラム名].png

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

スクリーンショット 2021-03-24 105145.jpg

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

まとめ

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

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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?