PandasのDataFrameから条件に合うrowを抽出する方法をスクショ付きで解説　no.15

![見出しを追加 (38).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/7088c16e-2dd0-4239-8339-7a7121b51f20.png)
こんにちは、まゆみです。

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

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

今回の記事では、

Pandas のDataFrameオブジェクトから、<font color="Red">あなたの条件に合うようなrow (行)を取り出すにはどうしたら良いか</font>

を書いていこうと思います

![本文を追加 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4c803d95-b5e4-4f33-28cc-a90a98330ae0.png)


例えば、

>gender コラムのなかが『male』の値になっている行を取り出したり

>salary コラムの値が300以上の行を取り出したり

と言った風に条件に合うものを取り出す方法を書いていきます

<font color="Red">年月日のフォーマットを変更して、年月日を基準にした行の取り出し方も紹介します</font>
(例えば、1990年以前に生まれた選手を取り出したいというような場合。)
ので、是非じっくりと読み進めてみてください。


ではさっそく始めていきます

#今回使うデータ

今回も前回と同じく、[National Football Leagueの選手のデータ](https://gist.github.com/craigmbooth/5a9be04fe72d77fa3cff)を使わせていただきます。

まずCSVデータを読み込みます

(CSVデータの読み込み方が分からない方は[こちらの記事](https://qiita.com/Mayumi_Pythonista/items/c29197abd4af408a8d17)をどうぞ)
※Series ではなく、DataFrame を使いたいので、CSVデータの読み込みまでしてください。

実行結果は下のようになります

![スクリーンショット 2021-03-20 092008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f188cdb6-19e6-7273-f135-4cd8e7ccda7a.jpeg)

#height_in_inchesから条件に合ったrow を抽出する
height_in_inches(インチ表示の身長)のコラムから、<font color="Red">75インチの選手のデータを抽出してみましょう</font>

まず、このDataFrame のなかでも特に『height_in_inches』のコラムだけを使いたいので

```
nfl["height_in_inches"]
```
ですね。

その値が75と等しい部分なので

```
nfl["height_in_inches"] == 75
```

となります

すると、値が75になっている部分がTrue、それ以外がFalseと返されました。

![スクリーンショット 2021-03-20 121600.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/752c1f00-1ee5-de85-9ccf-f36a4da3b40e.jpeg)

そして値がTrueになっているrow だけを取り出したいので

```
nfl[ nfl["height_in_inches"] == 75 ]
```

となります

![スクリーンショット 2021-03-20 122312.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0d520c6d-ca7c-f9f3-be03-1fd796a68d51.jpeg)

今のプロセスを簡単に図にすると以下のようになります

![本文を追加 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/06739252-fd06-4237-5cad-2104bbb8529d.png)

<font color="Red">①の部分に条件文を書けば、</font>あなたの課した条件に合致するrow が取り出される仕組みになります。

今回は　

>『==』を使い、○○と一致する条件を満たすもの

>を取り出しましたが、

>『!=』『>=』なども①の部分に条件として書くことができます



#生年月日に条件付けをして条件に合うrow を抽出する

当CSVデータではdata_of_birth のコラムが

dd/mm/yyyy

というフォーマットで書かれているので、これをPandas で分析できるフォーマットに書き換えないといけません。

それには2つの選択肢があります。

>①　to_datetime()メソッド

>②　read_csv()のパラメータparse_datesの引数を変える

一つづつ説明していきます。

##1.) to_datetime()メソッド

![スクリーンショット 2021-03-20 092545.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/07865519-d13e-4466-34e9-da6767cea04c.jpeg)
引用元：[Pandasドキュメント](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html)

date_of_birth を.to_datetime()で形式を変更して、さらに、同じコラム名に代入して、上書きをしました。

実行結果は下のようになります


![スクリーンショット 2021-03-20 093818.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/c49c2703-7430-7207-fa85-0497488aa891.jpeg)

オリジナルのデータの『date_of_birth』のコラムが新しい形式に変えられました。

###to_datetime()を使うと、データ型はどう変わる？

to_datetime()によって、Pandasで分析をできる形式のデータに変えることができると先ほど申し上げましたが、具体的に、データ型がどのように変わるのかをここで、お見せしますね。

(info()メソッドを使うと、DataFrameの概要を見ることができます)


![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e5c0a584-7e3d-e603-f78c-540296b87b11.png)

before に書いているのが、オリジナルのデータの概要です。

date_of_birth はobject と書いていますが、objectとはPandasのなかのstringのようなものになります

after のdate_of_birthをみると、datetime64[ns]と書いています

データ型が変わったのが分かると思います

##2.) read_csv()のパラメータparse_datesの引数を変える

次に紹介するやり方をすると、先に紹介したやり方よりも少ないコードで済みます。

```
.read_csv(parse_dates = ["コラム名"])
```

実行結果は下記のようになります

![スクリーンショット 2021-03-20 115837.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/303724ba-abd7-e1f8-6655-f2ca9b1b4d8e.jpeg)

ここで一つ注意点があります

![スクリーンショット 2021-03-20 120352.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/fe247969-46b7-613b-c05d-0a7fd0493bd0.jpeg)
引用元：[Pandasドキュメント](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html)

例え1つのコラムだけ、datetime オブジェクトにしたい時であっても、引数はリスト型で書かなければいけません。

なので

parse_date = "birth_of_date" ではなく

parse_date = ["birth_of_date"] と角括弧が要ります。

##1990年以降に生まれた選手のデータを抽出する

まず、nfl という変数に代入されているのはDataFrame全体ですね。

そこから、date_of_birth　のコラム名がついた部分だけを取り出します

```
nfl["date_of_birth"]
```

![スクリーンショット 2021-03-20 094922.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/6e5bd0aa-8aea-36dc-73a6-cbcaebe869b7.jpeg)

このnfl["date_of_birth"] で"1990" より大きい数字をはじき出すわけですから

```
nfl["date_of_birth"] >= "1990-01-01"
```

となります

![スクリーンショット 2021-03-20 125658.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5064e059-c5f8-76cd-c8b6-a15169f95d87.jpeg)

ここでも

```
DataFrame[ 条件文 ]
```

となっています


#まとめ

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

次回も引き続きPandasについて書いていきますね。