
はじめに
データ分析・データサイエンスの初心者・初学者に最初に覚えて欲しいPythonのライブラリがいくつかあります。
今回はその中の一つである、データ分析でよく使うPandasのメソッドであるloc[]、iloc[]、drop()、isin()、info()とastype()、isnull()とisna()やpythonのスライスを紹介します。
このブログでは、①基本をしっかりと示し、②実際のデータ分析でどのように使われるかという具体例を紹介します!
読み終えたあとには、しっかりとその構文が身についていると思います。
それではさっそく、Google Colaboratoryをつかって動かしてみましょう。
Google Colaboratoryについては知りたい方は、以下のブログ記事を参考にしてください。
>>Google Colaboratoryとは? いつできた? mount、ファイルの読み込み等の使い方
>>Google Colaboratoryよく使う便利なショートカットキー
loc[]
loc[①,②]、①の部分に行名、②の部分に列名をいれることで要素を取得できます。
さっそく、データサイエンス100本ノック(構造化データ加工編)のデータセットを用いて見てみましょう。
データサイエンス100本ノック(構造化データ加工編)を知りたい方は下記のブログ記事を参考にしてください。
>>【Google Colabはじめ方】データサイエンス100本ノックーデータサイエンティスト協会
上記df_customerから、loc[]を使って、①行0、②列名customer_nameの要素を取り出してみます。なお、df_customerは行名はないので、行番号で指定しました。

次は、複数の要素を取得してみましょう。複数の要素を取得するには。:を用います。
①として行1から4を取りたい場合、1:4とします。次に、customer_nameから、genderを取りたい場合は、‘customer_name’:’gender’とします。
iloc[]
iloc[①,②]と書きます。①の部分に行番号、②の部分に列番号をいれることで要素を取得できます。
locで取り出したものと同じように、大野あや子さんを取得してみましょう!
大野あや子さんは、行番号0で列番号1です。それをiloc[]に入れてみると。
次に、locで取り出したものと同じ複数の要素を取得してみましょう!
注意として、ilocは番号指定になり、:の部分はスライス表記となります。そのため、、locで取り出したものと同じ複数の要素を取得するには、①の部分は1:5となります。そして、②の部分は、1:4となります。
スライス~Python~
スライスとは、Pythonの範囲の指定方法で、:を用いて指定します。例えば、[A:B]とコードを書いた場合、この意味としては、A番目からBマイナス1番目までのものを指定するということです。
つまり、先ほどのilocの例でいうと、iloc[①1:5,②1:4]とすることで、①としては、1番目の行から4番目の行までが指定され、②は1番目の列から3番目の列までが指定されています。
また、①をコロンにすると、全てとなります。そのため、全ての行が指定されます。
また、–も用いることができます。例えば、最後の稲垣さんを選択したい場合は、-1:とすることで、最後のマイナス1行から全て(最後の行)と指定できます。
drop()
dropメソッドを使用すると、ある特定の行や列を削除したものを表示できます。
drop(①、②)。①に列を指定し、②をaxis=1とすると列を削除したものが表示されます。
一方、①に行を指定し、②をaxis=0とすると行を削除したものが表示されます。なお、axis=0はデフォルト値なので、②は省略できます。
まずは、列の削除から見てみましょう。
それでは、df_customerから、dropメソッドを使って、customer_nameの列を削除してみましょう!
df_customer.drop(‘customer_name’,axis=1)と打ちます。customer_nameの列が削除されたものが表示されてますね!
複数列の削除はどうすればよいでしょう。
df_customer.drop([‘customer_name’,’address’],axis=1)と打ちます。複数列の場合は[]を用います。
次は、行の削除を見てみましょう。
df_customerから、dropメソッドを使って、0行目のデータを削除してみましょう!
df_customer.drop(0,axis=0)と打ちます。0行目のデータが削除されたものが表示されてますね!
また、先ほど記述したようにaxis=0はデフォルト値なので、省略しても同じ結果となります。
注意 元のデータには反映されていません。つまり、df_customer.head()と打つと、先ほど消した0行目のデータは当然そのままあります(列の場合も同様です)。
削除したものをデータとして利用したい場合は、下記のように、別のデータフレームに格納するか、引数にinplace=Trueとしてください。
df_customer.drop(0)をdf_customer_drop0に格納する方法は以下のようにします。
inplace=Trueでも同じ結果です。
ただし、こちらは、df_customer自体の中身を変えてしまうので、先ほどの別のデータフレームに格納する方法のほうが元のデータフレームを維持できるので安心かと思います。
もう一歩踏み込んでみましょう。
ある特定の条件を満たすものを削除したい場合はどうすればいいでしょうか?
gender_cdが0の人を削除したい場合はどうすればいいでしょうか?下記のコードで目的を達成できるでしょうか?
df_customer.drop('gender_cd==0')

これでは、できません。drop()の引数には、削除したい列のindexのリストを指定する必要があるからです。そこで、以下のように違う方法で行うことを勧めます。
df_customer[df_customer['gender_cd']!=0]

つまり、df_customerのgender_cdが0じゃない人を指定して、これを抽出する。これで、gender_cdが0の人を削除できました。
さらに応用です。
ある特定の条件を複数満たすものを削除したい場合はどうすればいいでしょうか?
例えば、gender_cdが0と1両方に当てはまる人を削除したい場合です。それは以下のようにしましょう。
df_customer[(df_customer['gender_cd']!=0) & (df_customer['gender_cd']!=1)]

なお、gender_cdが0又は1に当てはまる人を削除したい場合は以下のようにしましょう。
df_customer[(df_customer['gender_cd']!=0) | (df_customer['gender_cd']!=1)]
isin()
isinメソッドを使用すると、条件に合致したものをbool値(True、False)で返してくれます。
df_customerの全ての要素に対して、女性の文字列を探してみます。
df_customer.isin([‘女性‘])と打つます。Trueの部分が女性の文字列の部分になります。
今度は、列をgenderに指定して、その中で女性と不明という2つの文字列を探してみます。先ほど2行目がFalseになっていたのが(2行目のgenderは不明)、Trueに変わりましたね!
isnull()とisna()
isnullメソッドやisnaメソッドを使用すると、nan(欠損値)をbool値(True、False)で返してくれます。nanの場合がTrueとなります。isnull()とisna()のどちらでも好きなほうを使用してください。

次は、別の新しいデータフレームを用います。
これにisnull()やisna()を使用してみましょう。

上記のデータフレームでは、ご覧のようにnanがありませんので、全てFalseで返ってきています。
しかし、先頭の5行しかみていないので、他にnanがあるかもしれません。その場合には、isnull().sum()やisna().sum()を使用しましょう。これで、欠損値の合計がわかります。

mode_priceの部分に20個の欠損値があります(nanが20個)。
そうすると、この欠損値がどこの部分なのか気になりますね。それでは、欠損値を抽出してみましょう!!
それには、まず、上記のようにisnull()やisna()を用いて、mode_priceのnan値だけのものを作成します。

そして、上記のloc[]を用います。
復習です。loc[①,②]は、①の部分に行名、②の部分に列名をいれることで要素を取得できます。
欠損値の部分を抽出したいので、①の部分は、先ほど作成したna_rowとし、②は全ての列を表したいので:とします。それではみてみましょう。

これで、欠損値の部分が抽出ができました(nanの部分の抽出)。
info()とastype()
次は、型変換を覚えましょう。
データには「型」というものがあります。整数型(int)とか小数点型(float)とか文字列型(object)などです。
例えば、データサイエンス100本ノック(構造化データ加工編)のデータセットのdf_productを見てましょう!

各カラムの数字には、整数だけの表示と小数点が入っている表示とがありますね。これは型が違う可能性があります。そこで、このデータは、どんな型なのか実際に調べてみましょう。その時に用いるのがinfo()です。

♯の部分を見みてください。Column(カラム)、Non-Null Count(欠損していない値の数)、Dtype(データの型)が表示されています。
つまり、df_productのカラムの型は以下です。
product_cd:object
category_major_cd:int64
category_medium_cd:int64
category_small_cd 10030:int64
unit_price 10023:float64
unit_cost 10023:float64
各カラムは単なる数字に見えますが、info()で見てみると3つの型に分かれています。
今回のデータは、unit_priceとunit_costがどちらも小数点型なので、こちらを用いて計算する場合不都合はないかもしれん。しかし、unit_priceが整数型、unit_costが小数点型と異なっていた場合はどうでしょうか。型が違っていると計算に影響が出るかもしれません(実際影響が出るかは私は知りませんが。。。)。また、実務でもcsvファイルをもらった際に、整数型でいいのに、整数型と小数点型が混ざっていたりする場合があります。いずれにしても、少し気持ちが悪いので、型をそろえたいですよね。
その時に用いるのが、astype()です。df_productを用いて試してみましょう。今回unit_priceとunit_costの小数点型を整数型に変換してみます。なお、先ほどのinfo()でみたように、unit_priceとunit_costは10030個のデータのうち10023個の欠損していない値があるということですが、これは逆にいうと7個欠損値があるということです。欠損値は、nan表示がされているので、これをintに変換しようとすると、Cannot convert non-finite values (NA or inf) to integerというエラーが出てしまいます。まずは、fillna()を用いて欠損値Nanを0に埋めときましょう。埋めたものをdf_product_intに格納します。

これで欠損値が埋まりましたので、下準備ができました。astype()を用いてデータ型を変更します。astype()の引数に{カラム名:型}を指定すると、単数又は複数の列のデータ型を変更できます。

データ分析入門・データサイエンス初心者・初学者向けにデータ分析でよく使うPythonをまとめました。
>>【データ分析初心者】Python構文~if文、format記法とf文字列~
>>【データ分析初心者】Python構文~for文、range関数、zip関数、enumerate関数~
>>【データ分析初心者】Python構文~無名関数lambda式、内包表記、map関数~
>>【データ分析初心者】Matplotlib、Seabornーscatter()、hist()、countplot() 、barplot()
>>【データ分析初心者】Pythonを使って、和暦から西暦への変換を行う
書籍や動画でデータ分析を学びたい方へ
機械学習やデータサイエンスを独学で学びたい方のために、ブログ記事をまとめてみました。
書籍、動画などなど、厳選したオススメの方法をまとめています。
興味がある方はご覧ください。

