【データ分析初心者】Pandas~loc[]、iloc[]、スライス、drop()、isin()、info()とastype()、isnull()とisna()

※アフィリエイト広告を利用しています。

はじめに

データ分析データサイエンスの初心者初学者に最初に覚えて欲しいPythonのライブラリがいくつかあります。

今回はその中の一つである、データ分析でよく使うPandasのメソッドであるloc[]iloc[]drop()isin()info()astype()、isnull()isna()pythonスライスを紹介します

このブログでは、①基本をしっかりと示し、②実際のデータ分析でどのように使われるかという具体例を紹介します!

読み終えたあとには、しっかりとその構文が身についていると思います。

それではさっそく、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の人を削除したい場合はどうすればいいでしょうか?下記のコードで目的を達成できるでしょうか?

df_customer.drop('gender_cd==0')

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

df_customer[df_customer['gender_cd']!=0]

つまり、df_customergender_cd0じゃない人を指定して、これを抽出する。これで、gender_cdの人を削除できました。

さらに応用です。

ある特定の条件を複数満たすものを削除したい場合はどうすればいいでしょうか?

例えば、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_pricenan値だけのものを作成します。

そして、上記の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_priceunit_costがどちらも小数点型なので、こちらを用いて計算する場合不都合はないかもしれん。しかし、unit_priceが整数型、unit_costが小数点型と異なっていた場合はどうでしょうか。型が違っていると計算に影響が出るかもしれません(実際影響が出るかは私は知りませんが。。。)。また、実務でもcsvファイルをもらった際に、整数型でいいのに、整数型と小数点型が混ざっていたりする場合があります。いずれにしても、少し気持ちが悪いので、型をそろえたいですよね。

その時に用いるのが、astype()です。df_productを用いて試してみましょう。今回unit_priceunit_cost小数点型整数型変換してみますなお、先ほどのinfo()でみたように、unit_priceunit_cost10030個のデータのうち10023個欠損していない値があるということですが、これは逆にいうと7個欠損値があるということです。欠損値は、nan表示がされているので、これをintに変換しようとすると、Cannot convert non-finite values (NA or inf) to integerというエラーが出てしまいます。まずは、fillna()を用いて欠損値Nanをに埋めときましょう。埋めたものをdf_product_intに格納します。

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

書籍や動画でデータ分析を学びたい方へ

機械学習データサイエンス独学で学びたい方のために、ブログ記事まとめてみました。

書籍、動画などなど、厳選したオススメの方法をまとめています。

興味がある方はご覧ください。