PandasのBroadCasting とは？　no.12

![見出しを追加 (35).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e745b318-d255-43c3-07f6-239333391c7a.png)
こんにちは、まゆみです。

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

今回は12回目の記事になります。

Pandasを勉強していると<font color="Red">『ブロードキャスト(Broadcast)』というコンセプト</font>をよく聞くことになると思います。

今回の記事では、Pandasで使われるブロードキャストとは具体的にどういう意味なのか、例を示しながら書いていこうと思います

この記事を読むと

<ul>
<li>ブロードキャストとは？</li>
<li>ブロードキャストなメソッドはどのように働いてくれるのか？</li>
<li>2つ以上のコラムにそれぞれ違う計算をしたい時の方法</li>
</ul>
が分かります


ではさっそく始めていきますね。
#今回使わせてもらうデータ
![National Football League.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/1bd67e41-7934-9843-234d-90603c4c0c80.png)


この記事では[アメリカンフットボールの選手の身長・体重・生年月日に関するデータ](https://gist.github.com/craigmbooth/5a9be04fe72d77fa3cff)を使います。

※身長はインチ、体重はポンドの単位が使われています

#CSVデータを読み込み必要な部分を取り出す

![スクリーンショット 2021-03-18 084713.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f9f2f8d3-9c82-d5fb-8d07-511bb0a1780d.jpeg)

今回使うCSVデータは上記のようになっています

<font color="Red">『full_name』『height_in_inches』『weight_in_lbs』のコラムを使い、full_name をインデックスとして</font>使います

```
players_data = pd.read_csv("ファイル名", usecools =["full_name","height_in_inches","weight_in_lbs"], index_col="full_name")
```
実行結果は下のようになりました

![スクリーンショット 2021-03-18 085255.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/04a83d5d-b63c-4b80-dc31-02c791826ce7.jpeg)




#Pandasのブロードキャスト(BroadCast)を具体的に

![名称未設定のデザイン (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5430f283-b373-0f14-9c4d-83efc1971471.png)

『ブロードキャスト』という言葉を聞くとテレビやラジオなどを思い出すと思いますが、Pandasでいうブロードキャストも似たような概念になります。

<font color="Red">ある1つの同じメッセージが各家庭に届けられる</font>

そのような感じだとまずはざっくりと理解してくださいね。
ここで言う各家庭というのは、一つ一つのセルに入った値の比喩だという感じでとらえてみてください。


#ブロードキャストなメソッドを集めてみました。

[こちらは](https://www.oreilly.com/library/view/introduction-to-pandas/9781771375764/video240040.html)Pandasのブロードキャストについての説明をしている動画になります。(英語になります)

ブロードキャストという概念はPanda やNumpyには存在しますが、Python にはありません。

また、Pandas のSeries であれ、DataFrame であれどちらにもブロードキャストの考え方は存在します。


『ブロードキャストな』という表現が日本語としてあっているか少し自信がないですが(適切な日本語がわかる方は是非教えてください。<(_ _)>)以下に、ブロードキャストな働きをするメソッドを紹介していきますね。


##add()など

```
import pandas as pd
df = pd.csv_read("ファイル名")
df.add(5)
```

<font color="Red">DataFrameの全体に</font>add()メソッドが適応されるのではなく

<font color="Red">DataFrameの値一つ一つに</font>add()が適応されます。

では、最初のプロセスで取り出したDataFrame にadd() を適応するとどうなるかを示しますね。

![スクリーンショット 2021-03-18 085534.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/eca95a56-dbfc-a5df-beca-6e08355ea4f7.jpeg)

DataFrame の一つ一つの値に５が足されているのが分かります。

こちらのショートハンドは

```
df + 5
```
です。

DataFrame というオブジェクトと　整数(integer)というデータ型が違うもの同士を足し、エラーが出そうに感じますが、これでもちゃんとコードは実行されます

![スクリーンショット 2021-03-18 090614.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/cf70c4a5-5d86-65d5-ae70-caa373f89011.jpeg)

同じ結果になりました。

>引き算　.sub()

>掛け算　.mul()

>割り算　 .div()

も同じように一つ一つの値に対して計算した結果を返してくれます。


#ポンドの体重をキログラムに、インチの身長をセンチに変えたい

ここで問題が起こります。

>ポンドをキログラム表示に変えたい時は

>(ポンド)　×　(0.453592)

>インチをセンチメートルに変える時は

>(インチ)　×　(2.54)


と違う数字を掛け合わせたいので、上記のやり方では、うまく行きません。

一様に同じ計算を施してしまうからです。


##解決策

>①DataFrame["コラム名"] で計算を施したいコラムを指定する

>②DataFrame["新しいコラム名"] = DataFrame["計算を施したいコラム名"] * 0.453592 とすると新しいコラムが作られる

キログラム表示の新しいコラムが最後のコラムの次に足されます

![スクリーンショット 2021-03-18 093852.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/46f28fe8-6426-4031-5ce6-2083e1b0086d.jpeg)

センチ表示の身長も新しいコラムとして足してみました

![スクリーンショット 2021-03-18 094754.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/21a3168d-9eff-bd25-dd82-fccdfbda26a1.jpeg)

やはり日本人には、センチとキログラムで表示してくれた方が分かりやすいですよね。

しかし、アメリカのアメフト選手デカいですね(笑)


#まとめ

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

Pythonには無いコンセプトもPandas にはあって、そこがPandasを少しややこしい物にしている時もあるかも知れませんが、また気づいたことがあれば、記事にしていきますね。

次回もよろしくお願いします！