【Pandas】.str.split()メソッドを使い、NBA選手の名前と苗字について調べた no.23

![見出しを追加 (51).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/32c88077-c85b-ce27-7776-410d358de03e.png)
こんにちは、まゆみです。

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

今回の記事は、第23回目になります。

[前回](https://qiita.com/Mayumi_Pythonista/items/dc05c54bd0fa4e356ddf)に引き続き、今回の記事でもPandasのDataFrameの中の文字列データを扱う方法を書いていこうと思います。

今回の記事では、Pythonでも使うsplit()メソッドを使って、NBA選手の名前を姓と名に分けてそのデータを色々と分析してみます。

ではさっそく始めていきます
#今回使うデータ

[NBA選手のデータ](https://www.kaggle.com/justinas/nba-players-data)を使わせてもらいます。

こちらのデータをread_csv()で読み込むと下記のようになります。
![スクリーンショット 2021-03-28 080913.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/58de7374-2de5-6cec-9025-938c907e88a2.jpeg)


#.split()メソッド

まず、.split()メソッドがどのような機能を持ったメソッドなのか、[w3schools.com](https://www.w3schools.com/default.asp)から定義を引用しました。

![スクリーンショット 2021-03-28 075216.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/62873a77-1570-3207-b15a-5092bcf00a12.jpeg)
引用元：[w3schools.com](https://www.w3schools.com/python/ref_string_split.asp)

Pythonの文字列に対して、.split()を使ってみますね。

空白で区切りたいので引数に、""を渡しました。

![スクリーンショット 2021-03-28 080412.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/09cbd150-520a-552d-ec55-8b4a6227ab66.jpeg)
空白の部分で、それぞれの文字列が割かれリストにして返されました。

では、このsplit()メソッドをPandasのSeriesオブジェクトに対して使ってみます。
#.split()メソッドをPandasのSeriesオブジェクトに使う
PandasのSeriesに対して、Pythonのメソッドを使うので、

```
Series.str.split()
```
のように、<font color="Red">間に『.str』が必要</font>です。
※詳しくは[前回の記事](https://qiita.com/Mayumi_Pythonista/items/dc05c54bd0fa4e356ddf)にも書いています。

今回使うデータの、『player_name』と書かれたコラムを使い、選手の名前や苗字について調べていきます。

<font color="Red">選手の名前と苗字が空白で区切られている</font>ので、split()メソッドを使い、名前と苗字を別々に取り出していきましょう

.str.split("")を使うと、実行結果は以下のようになりました。

![スクリーンショット 2021-03-28 081734.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ea41e247-60d4-d777-496d-0217620ffbed.jpeg)

その次に、返されたリストのなかのインデックス0のみを取り出したいので、

```
.str.get(0)
```
と続けて書きます。


![スクリーンショット 2021-03-28 082221.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f5a3f241-98a3-cbf4-becb-7995c930b751.jpeg)

それぞれの値がいくつあるか数えたいので

```
.str.value_counts()
```
と続けます。

![スクリーンショット 2021-03-28 082527.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/44b32a07-bcb8-b3ee-1d01-50be65968f77.jpeg)

NBA選手の中で、どんな名前の選手が何人いるのかのデータが取れました。

同様に、NBA選手の苗字について調べたい時は、.split()で分割した後、2番目の要素を取り出したいので、get()メソッドの引数を1にすれば大丈夫です。
![スクリーンショット 2021-03-28 082851.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f12a4b2f-ee39-6517-564c-dab82385252a.jpeg)

ただ、外国人の名前は、名前の最後に『Jr.』が入っていたりミドルネームが入っている場合もあり

>First-name , Last-name

>になっていないところもあるかも知れません。

そこで便利なのが、str.split()のパラメーターexpandです。

#.str.split()のパラメーターexpand

![スクリーンショット 2021-03-28 084539.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ade30b15-48f4-355b-906e-43c1e7b97ffd.jpeg)
引用元：[Pandasドキュメント](https://pandas.pydata.org/docs/reference/api/pandas.Series.str.split.html#pandas-series-str-split)

expandのデフォルト値はFalse ですが、True に変えると、DataFrameを返してくれます。

![スクリーンショット 2021-03-28 084922.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a973dbee-e9f0-3f3e-04e9-9bd0057580ed.jpeg)
このようになりました。

インデックス11141の選手名には、Jr.がついています。

また、この返されたDataFrameを新たにDataFrameのコラム名に代入して、このデータをオリジナルのDataFrameの右端につけ足すこともできます

![スクリーンショット 2021-03-28 091153.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/8dde2086-da56-51c5-1793-ee3cfde825c0.jpeg)

ただ、このままだと最後のコラム『blank』が不要な気がします。

![Melvin Frazier Jr. (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a7f059f3-0900-8a3f-d240-cca6c3faeefb.png)



.str.split(" ", expand=True)でSeriesを空白で分割したDataFrameにした時に、選手の名前に最大３の空白があったので、4つのコラムを作らざるを得なかったのです。(.split()で4つに分割されたら、４つ新しいコラム名を作らないとエラーが出る)

#.str.splitのパラメーターnの使い方

![スクリーンショット 2021-03-28 094145.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/36d9e8d8-3c8a-2164-39d4-c7d098816360.jpeg)

上記のような場合、3つの空白の部分で区切ってDataFrame にするのではなく、最初の2つの空白だけで区切りたいですよね。

そのような場合.str.split()のパラメーター　n=の引数に区切りたい数を書けば大丈夫です。