データ抽出する際に利用するPandasのメソッドまとめ【Python】


# はじめに

Pythonでデータを取得する際、
Pandasのライブラリを頻繁に利用します。

ところが、データ分析の初心者は、

* どのようにデータを取得すればよいか、イメージできない
* どのメソッドを利用すればよいか不明

という状況にわりとなります。

この記事では、
データを抽出時に頻出のメソッドをまとめてみました。

※　主にこれからPythonを学習される方向けの記事となっています。
※　細かい点については、[公式ドキュメント](https://pandas.pydata.org/pandas-docs/stable/reference/frame.html)にて、ご確認ください。

# 環境

* Python 3.7.6
* Pandas 1.0.0

# Pandasとは？
データ分析を効率的に行うため、Pythonのライブラリの一つです。


# 実装

## 必要なデータの読み込み
今回は、seabornで標準利用が可能な「iris」のデータセットを利用します。

```python
import seaborn as sns
iris = sns.load_dataset('iris')
iris.head()
```
![スクリーンショット 2020-05-06 11.44.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/e572b9ee-7d69-1e44-b5fe-458434efd07e.png)

## 行列を指定してデータを抽出する 

行番号や列番号を指定することで、自由にデータを取得できます。

### 行番号を指定したデータ抽出

```python
# 3行目のデータ
iris.iloc[3]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/28143eb7-eb70-315a-24b4-097cba5cd6f5.png)

ilocでは、行番号を指定することでデータを取得できます。

```python
# 0〜2行目のデータ
iris.iloc[:3]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/99ee7901-53e1-037f-c8d4-af54458ef69c.png)

```python
# 3行目 1列目の値
iris.iloc[3, 0]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/bbfff17f-e255-8852-211c-424dfd9e3fea.png)

```python
# 0〜2行目、2列目〜3列目のデータ
iris.iloc[:3, 2:4]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/741b6aa5-fbfa-ee8a-164c-042708906e32.png)

### 行番号、列名を指定し、データを抽出する

```python
iris.loc[[2,4,6],['petal_length', 'petal_width']]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/c49c6d0d-f51f-38ef-0096-32b1ffd2e491.png)

locでは、行インデックスを指摘することで、データを取得できます。

## 特定条件のデータを抽出する

条件を指定して、データを抽出する方法は、以下のとおりです。

### 完全一致条件によるデータ抽出

speciesの項目について、内容が、`setosa`と一致する件数を取得します。

```python
len(iris[iris['species'] == 'setosa'])
```

### 複数条件を使ったデータ抽出

データ抽出する際、複数条件で絞りたい場合は、条件を付与することで実現できます。

```python
# and条件は()&()で、or条件は()|()
iris[(iris['species'] == 'setosa') & (iris['petal_width'] > 0.5)]
```

### 部分一致条件によるデータ抽出

条件は、完全一致だけでなく、部分一致した内容を抽出したいケースもあり、このような場合は、以下の内容で実現できます。

```python
# 部分一致検索(seと部分一致するもののみ抽出する)
iris[iris.species.str.contains('se')]
```

## データを集計する

集計時は、DataFrameGroupBy型に変換した上で、加工します。

```python
iris_group = iris.groupby('species')
type(iris_group)
```

出力結果は、以下のとおりです。

```
pandas.core.groupby.generic.DataFrameGroupBy
```

### 平均値

```python
iris_group.mean()
```

出力イメージは、以下のとおりです。

![スクリーンショット 2020-05-06 11.53.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/d089d5a3-d882-3436-730c-e273e3b0edf9.png)

他にも、最小値、最大値、標準偏差なども算出できます。


複数条件による、集計も可能です。

```python
iris_group2 = iris.groupby(['species', 'petal_width'])
iris_group2.mean()
```

![スクリーンショット 2020-05-06 11.55.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/f202fe21-6966-c2b0-1a02-404b30e17852.png)

## データを結合する


### 同じカラム構成のデータを結合する
同じカラム構成となっている、データを結合する場合、appendメソッド、または、concatメソッドを利用します。

今回は、Panadasメソッドを中心に説明しているので、concatメソッドで結合します。

```python
import pandas as pd
iris_master = pd.DataFrame([['0', 'setosa'], ['1', 'versicolor'], ['2', 'virginica']], columns=['id', 'name'])
iris_master
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/62b90536-6d05-bfb6-e2fe-67cf60cef648.png)


```python
add_iris = pd.DataFrame([['3', 'hoge']], columns=['id', 'name'])
add_iris
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/8b46e0ac-2ddf-4331-eff5-d521941f5774.png)

```python
pd.concat([iris_master, add_iris])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/bba2d301-f02d-3133-d24a-aee2d07fbfcd.png)



### 異なるカラム構成のデータを結合する
データのカラム構成が異なる、複数のデータを結合する場合、mergeメソッドを利用します。
(他にもjoinメソッドでも結合は可能ですが、キーにしたい列をindexにする必要があり、少し面倒なので、まずはmergeメソッドが利用できるれば、問題ないかと考えています。)

結合する際は、結合するためのキー項目を指定することで、
同じ項目同士で行を結合します。

```python
pd.merge(iris_group2.mean(), iris_master, left_on='species', right_on='name')
```

![スクリーンショット 2020-05-06 12.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310367/6b4489f5-c06e-0f6d-aaca-8f402a4e9237.png)

# 最後に

今後、以下の内容について充実させる予定です。

* データの読み込み(read_csv)

# 参考情報
上記内容は、以下のサイトをベースにまとめました。

* [【Python】pandas, seabornの計算処理のまとめ](https://obgynai.com/python-pandas-calculation/)

* [pandasのdataframeの要素の参照方法をマスターしよう](https://obgynai.com/python-pandas-dataframe-referance/)

* [pandasでDataFrameのデータを結合する方法](https://obgynai.com/python-pandas-index-merge-join/)

こちらでは、より細かく説明されているので、不明な点があれば、ぜひ参考にしてください。