Pandasの記事をシリーズで書いています。
今回の記事は、第23回目になります。
前回に引き続き、今回の記事でもPandasのDataFrameの中の文字列データを扱う方法を書いていこうと思います。
今回の記事では、Pythonでも使うsplit()メソッドを使って、NBA選手の名前を姓と名に分けてそのデータを色々と分析してみます。
ではさっそく始めていきます
今回使うデータ
NBA選手のデータを使わせてもらいます。
こちらのデータをread_csv()で読み込むと下記のようになります。
.split()メソッド
まず、.split()メソッドがどのような機能を持ったメソッドなのか、w3schools.comから定義を引用しました。
引用元:w3schools.com
Pythonの文字列に対して、.split()を使ってみますね。
空白で区切りたいので引数に、""を渡しました。
空白の部分で、それぞれの文字列が割かれリストにして返されました。
では、このsplit()メソッドをPandasのSeriesオブジェクトに対して使ってみます。
.split()メソッドをPandasのSeriesオブジェクトに使う
PandasのSeriesに対して、Pythonのメソッドを使うので、
Series.str.split()
のように、間に『.str』が必要です。
※詳しくは前回の記事にも書いています。
今回使うデータの、『player_name』と書かれたコラムを使い、選手の名前や苗字について調べていきます。
選手の名前と苗字が空白で区切られているので、split()メソッドを使い、名前と苗字を別々に取り出していきましょう
.str.split("")を使うと、実行結果は以下のようになりました。
その次に、返されたリストのなかのインデックス0のみを取り出したいので、
.str.get(0)
と続けて書きます。
それぞれの値がいくつあるか数えたいので
.str.value_counts()
と続けます。
NBA選手の中で、どんな名前の選手が何人いるのかのデータが取れました。
同様に、NBA選手の苗字について調べたい時は、.split()で分割した後、2番目の要素を取り出したいので、get()メソッドの引数を1にすれば大丈夫です。
ただ、外国人の名前は、名前の最後に『Jr.』が入っていたりミドルネームが入っている場合もあり
First-name , Last-name
になっていないところもあるかも知れません。
そこで便利なのが、str.split()のパラメーターexpandです。
.str.split()のパラメーターexpand
引用元:Pandasドキュメント
expandのデフォルト値はFalse ですが、True に変えると、DataFrameを返してくれます。
インデックス11141の選手名には、Jr.がついています。
また、この返されたDataFrameを新たにDataFrameのコラム名に代入して、このデータをオリジナルのDataFrameの右端につけ足すこともできます
ただ、このままだと最後のコラム『blank』が不要な気がします。
.str.split(" ", expand=True)でSeriesを空白で分割したDataFrameにした時に、選手の名前に最大3の空白があったので、4つのコラムを作らざるを得なかったのです。(.split()で4つに分割されたら、4つ新しいコラム名を作らないとエラーが出る)
.str.splitのパラメーターnの使い方
上記のような場合、3つの空白の部分で区切ってDataFrame にするのではなく、最初の2つの空白だけで区切りたいですよね。
そのような場合.str.split()のパラメーター n=の引数に区切りたい数を書けば大丈夫です。