Pandas 入門

```matplotlib``` に引き続き、python のライブラリ```Pandas```について学んでいきたいと思います。

Pandas とは
=====================
pythonのライブラリで、データ分析用に表形式のデータや行列を扱う事が可能です。
集計処理、計算処理をPandasにて置き換えることが出来ます。

```pip``` 等でインストールも可能ですが、```Anaconda```に含まれていますので今回はそちらを使用します。

結果をすぐに確認するため、今回も ```Jupyter Notebook``` を使用します。

Pandas用語
===============
いくつか専門の用語がありますので、先に理解をします。

- ***Series*** 
データ形式の一つで一次元の配列から単一の列から成す表

- ***DataFrame***
行列からなる表形式の配列データ。Pandas の中心となるデータ形式です。

- ***index***
SeriesやDataFrameの行データに付与できるラベルです。

- ***columns***
DataFrameの列データに付与できるラベルです。

- ***integer-location***
DataFrame は行(列)形式のため、番号指定でデータにアクセス出来ます。
この方式をinteger-locationと呼びます。

よく使用されるpandasのデータタイプ
==================
pandasで使用されるデータタイプとして、標準にint以外に```Numpy```を使用したfloatや、文字列等が挙げられます。

| DataType | Description |
|:-:|:-:|
| ***bool*** | 真理値 |
| ***np.int64***  | 64bit整数(intと同等)  |
| ***np.float64***  | 64bit浮動小数点(floatと同等)  |
| ***pd.StringDtype()***  | pandasの文字列 |
| ***object***  | pythonのオブジェクト  |

Series
=======
Series は```pd.Series()```メソッドにて定義します。
この例では、```a,b,c,d,e```という列データに対して ```1,2,3,4,5``` という```index```が付与されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/59e21f76-f3af-228d-d27c-72214aae781c.png)

``` sample1.py
import pandas as pd

s = pd.Series(["a", "b", "c","d","e"], index=["1", "2", "3","4","5"])
print(s)
```

特定のデータの表示を行う場合、indexを指定して表示する事も可能です。
データタイプを表示するには```dtype```を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/be67e437-fe6d-135d-2d4c-bb8732d37cf2.png)

``` sample2.py
import pandas as pd

s1 = pd.Series([1, 2, 3], index=["a", "b", "c"])
# s1のindex=aの列データを表示
print(s1.a)

s2 = pd.Series([1, 2, 3], index=["a", "b", "c"], dtype=int)
# s2のデータタイプを表示
print(s2.dtype)
```

DataFrame
=======
DataFrame は表形式データで、Seriesのindex以外に```columns```という列データにラベルを付与します。```pd.DataFrame()```メソッドを呼び出して表形式のデータを生成します。

リストの場合、```pd.DataFrame(2次元配列データ, columns=columnsのリスト, index=indexのリスト)``` が基本になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/8f9b69ab-149d-394f-3386-e471ceb6d7f1.png)
 
``` sample3.py
import pandas as pd

df = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]], columns=['col1', 'col2'], index=["a", "b", "c", "d", "e"])
print(df)
```

辞書の場合、```data = { columns1 : データ配列 ..... , columns2 : データ配列 .... } pd.DataFrame(data , index=indexのリスト)``` が基本になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/6bcd23b0-4439-c6fa-89d1-0e50e4e48cec.png)

``` sample4.py
import pandas as pd

data = {'col1': [1, 3, 5, 7, 9], 'col2': [2, 4, 6 ,8,10]}
df = pd.DataFrame(data, index=["a", "b", "c","d","e"])
print(df)
```

ファイルの読み書き
=============
CSVからデータを読み込む場合 ```pd.read_csv()```メソッドを使用します。
```pd.read_csv(ファイルパス)``` が基本になりますが、index のラベルは任意で割り振りされます。
```index_col``` を指定する事で、対象列をindexとして割り振る事も可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/2b9f10cc-4728-c1cf-3c85-9dcf9f8d3a48.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/65a02343-a302-f33b-4850-de7e88bf15ff.png)

``` sample5.py
import pandas as pd

df= pd.read_csv("C:/Users/user-name/data.csv",index_col="col1")
print(df)
```

定義された DataFrameをCSVへ書き込む場合、```df.to_csv()```を使用します。
df.to_csv()が基本になりますが、```index=False```を指定する事で、indexを書き込みしない指定が可能です。

``` sample6.py
import pandas as pd

df = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]], columns=['col1', 'col2'], index=["a", "b", "c", "d", "e"])
df.to_csv("C:/Users/user-name/data2.csv")
```
- ***data2.csv の出力結果***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/eba120a7-6274-91f1-bbac-5f36ed360231.png)

- ***data3.csv(index=False)の出力結果***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/f5d7fa4c-5b91-45c7-bf46-272addaa9e98.png)

演算・統計
==========
DataFrameで同士では、カラムが一致している場合に四則演算を受け付けます。
四則演算に用いる 演算子は ```+,-,*,/``` となります。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/8397c91f-7fb1-e14d-60aa-8ffb30d87640.png)

``` sample7.py
import pandas as pd

df1 = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]], columns=['col1', 'col2'], index=["a", "b", "c", "d", "e"])
df2 = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]], columns=['col1', 'col2'], index=["a", "b", "c", "d", "e"])
sum =df1 + df2

print(sum)
```

統計処理を行う場合、以下のメソッドを使用します。

| Method | Description |
|:-:|:-:|
| ***df.count()***  | データ件数  |
| ***df.mean()***  | 平均  |
| ***df.max()***  | 最大値  |
| ***df.min()***  |  最小値 |
| ***df.var()***  | 分散値  |
| ***df.describe()***  | 一括取得 |
| ***df.sample()***  | ランダムに行の値を取得 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/22100beb-3681-5de7-bd19-947b870a9cdb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/b130e0ba-19cf-5ba3-e78a-d6d31167872d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/b6217542-8734-f0e9-b615-c72e48919834.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/29dc1a5e-888c-2ee9-05ff-5bef701758ae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/f3337fd8-12a4-1bc9-9fbb-5aadc8598408.png)

``` sample8.py
import pandas as pd
df = pd.DataFrame([[1,2], [3,4], [5,6], [7,8], [9,10]], columns=['x','y'])

# データ件数の取得
c = df.count()

print(c)
```

置換・ソート・集計
===============
データの置換を行う場合、```df.replace()``` メソッドを使用します。
```df.replace(置換したいデータ,置換後の値)``` を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/5f79a369-c369-19f1-174e-cb3c5525df88.png)

``` sample9.py
import pandas as pd

df1 = pd.DataFrame([["yuko","tomohisa"], ["eriko","yosure"]], columns=['Women', 'Men'], index=["a", "b"])
print(df1)
# yosure を yosuke へ置換
df2 = df.replace('yosure', 'yosuke')
print(df2)
```

ソートは、```df.sort_values()```メソッドを使用します。
```df.sort_values('ソートするcolumns',ascending=True[昇順]/False[降順])```が基本になります。
複数の columnsを指定する事は可能ですが、先頭にソートしたindexが優先されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/ed29e314-6790-9ee1-1a69-01cf8a16bf6a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/165495da-9503-deb3-87c9-64802190e2ee.png)

``` sample10.py
import pandas as pd

df = pd.DataFrame([[5, 4], [2, 6], [7, 8], [1, 10], [3, 9]], columns=['col1', 'col2'], index=["a", "b", "c", "d", "e"])
print(df)

df2 = df.sort_values(['col1'], ascending=[True])
print(df2)
```

集計は ```df.groupby()```メソッドを使用します。

| Method | Value |
|:-:|:-:|
| ***df.groupby([columns]).max()*** | 最大値 |
| ***df.groupby([columns]).min()***  | 最小値  |
| ***df.groupby([columns]).var()***  | 分散値  |
| ***df.groupby([columns]).sum()***  | 合計値  |
| ***df.groupby([columns]).mean()***  | 平均値  |
| ***df.groupby([columns]).std()***  | 偏差値 |

以下は、```index=team a,b,c``` に対して```height/weight``` のデータが入っています。これらteam a,b,c単位に各集計処理を実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/b2676284-5604-ab49-aef1-5724df55102a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/7e84013b-65e5-add0-c851-712e6fdc1f8c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/4d298974-d3a0-fcdd-d25b-b3bf638b80c8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/99dec997-bb74-b5b2-09e8-109d19038da1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/9cdf3537-02e4-4164-a1af-7b2f0a4448ce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/5976c4df-89b5-f1ce-84fc-ed4376134553.png)

```sample10.py
import pandas as pd

team = ["a", "b", "c", "b", "c", "a"]
height = [181, 180, 171, 167, 188, 159]
weight = [72, 82, 70, 67, 90, 59]
data = {'team': team, 'height': height, 'weight': weight}
df = pd.DataFrame(data)

m = df.groupby("team").max()
print(m)
```

フィルター
========
フィルターはindexと同じサイズの```bool型```のシーケンスを定義します。
True であるリストのみ表示されます。
以下の例では、```0行目、2行目、4行目``` が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/09b053a7-5dc9-50ff-b907-1b7ed7de0f32.png)

``` sample11.py
import pandas as pd

data = {'A': [1, 2, 3, 4 ,5], 'B': ["a", "b", "c", "d", "e"]}
df = pd.DataFrame(data)

condition = [True, False, True, False,True]
print(df[condition])

```




Pandas は他にも多くのメソッドが存在するため一括りは紹介できそうにありませんでした・・・・。
次回は pandas + matplotlib を組み合わせた記事を書こうと思います。

以上です。