pandas入門

#目次
[1.はじめに](#1-はじめに)
[2.pandasとは](#2-pandasとは)
[3.pandasのインポート](#3-pandasのインポート)
[4.pandasのデータ構造](#4-pandasのデータ構造)
[5.データの読み込みと加工](#5-データの読み込みと加工)
[6.おわりに](#6-おわりに)

#1. はじめに
最近[GCI](https://gci.t.u-tokyo.ac.jp/gci-2021-winter/)やE資格取得に向けた[プログラム](
https://www.skillupai.com/)を受けている真っ最中の初学者です。
この記事ではpandasの機能についてまとめていきます。

#2. pandasとは
- pandasとは、プログラミング言語pythonにおいてデータ解析を支援する機能を提供しているオープンソースのライブラリです。データサイエンスの分野では、機械学習前の前処理(データの加工・整形)などで多く使用されます。
- できること
 - csv,xlsxなどのデータの読み込み
 - 加工, データの抽出
 - 欠損値の補完
 - etc...

#3. pandasのインポート
ライブラリをインポートするための構文として以下の3種類があります。

- import `ライブラリ名(モジュール名)`
- import `ライブラリ名(モジュール名)` as `略称`
- from　`ライブラリ名(モジュール名)` import `機能名`

1番目,2番目はライブラリ全体をインポートしたい時、3番目は一部の機能のみインポートしたい時に用いられます。
特に2番目の構文を用いることで、ライブラリの機能を呼び出す際にコードを簡略化することができます。
今回は2番目の構文を用います。　

```py
import pandas as pd
```
`pandas`を`pd`という略称で読み込んでいます。`pd`と略すのは慣例なので特に意味はありません。

#4. pandasのデータ構造
pandasのデータ構造には主にSeriesとDataFrameの2種類があります。
(https://pandas.pydata.org/pandas-docs/stable/user_guide/dsintro.html)

`Series`は1次元、`DataFrame`は2次元のデータを扱う際に用いられます。

 - Seriesの例

```py
series = pd.Series([2,0,2,1,1,2,0,2])
series
```

```出力結果.
0    2
1    0
2    2
3    1
4    1
5    2
6    0
7    2
dtype: int64
```

Seriesでは左列にindex、右列に要素が入ります。
indexは指定することも可能です。

```py
series = pd.Series([2,0,2,1,1,2,0,2] ,
                   index = ['A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H'])
series
```

```出力結果.　

A    2
B    0
C    2
D    1
E    1
F    2
G    0
H    2
dtype: int64
```
 - DataFrameの例
 
```py
data = {'student　ID':[19001,19002,19003,19004] , 
        'nativeplace':['Tokyo' , 'Kyoto' , 'Fukuoka' , 'Hokkaido'] , 
        'age':[20 , 22 , 43, 19] , 
        'name':['Kota' , 'Yuki' , 'Tomoshi','Kaito']}
dataframe = pd.DataFrame(data)
dataframe
```

>出力結果
>
| |  student ID  |  nativeplace  |  age  |  name  |
|:---: | :---:  | :---: | :---:  | :---: |
|0|  19001  |  Tokyo  |  20  |  Kota  |
|1|  19002  |  Kyoto  |  22  |  Yuki  |
|2|  19003  |  Fukuoka  |  43  |  Tomoshi  |
|3|  19004  |  Hokkaido  |  19  |  Kaito |

左から1列目にindexが入ります。
1行目を`column`と呼びます。

#5. データの読み込みと加工


####5.1 ファイルの読み込み
 
 - **csvデータの読み込み**
 
`pd.read_csv`を用いることで読み込むことができます。
以下ではカルフォルニア大学のオープンデータセットを使用しています。
CSVは```Comma(,) Separated Values```の略称ですが、セミコロン( ; )で区切られているデータも存在します。その場合は引数に```sep = ';'```を追加する必要があります。

```py
winequality_data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv' , sep = ';')
winequality_data.head()
```

>出力結果
![スクリーンショット 2021-12-02 22.13.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495396/42c7511e-18ad-3c0d-cf3d-762205ca3683.png)

`DataFrame.head()`とすることで5行目までのデータを表示することが可能です。
任意の行数表示させたい場合は`DataFrame.head(10)`のように指定することで表示できます。

 - **Excelデータの読み込み**
 
 `pd.ExcelFile`を用いることで読み込み可能です。
以下ではcsv同様カルフォルニア大学のオープンデータセットを使用しています。

```py
onlineretail_data = pd.ExcelFile('http://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx')
onlineretaildata_table = onlineretail_data.parse('Online Retail')
onlineretaildata_table.head()
```
>出力結果
![スクリーンショット 2021-12-02 22.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495396/8c5ec99f-c725-d3b0-fa14-cce9b0b9a658.png)

----

####5.2 データの状態の確認
 - **データの行数,列数の確認**

`DataFrame.shape`とすることで取得できます。

```py
winequality_data.shape
```

```出力結果.
(1599, 12)
```
 - **データの性質の確認** :  `DataFrame.info()`とすることで変数の型,欠損値の有無などが確認できます。　
 
```py
winequality_data.info()
```

```出力結果.
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1599 entries, 0 to 1598
Data columns (total 12 columns):
 #   Column                Non-Null Count  Dtype  
---  ------                --------------  -----  
 0   fixed acidity         1599 non-null   float64
 1   volatile acidity      1599 non-null   float64
 2   citric acid           1599 non-null   float64
 3   residual sugar        1599 non-null   float64
 4   chlorides             1599 non-null   float64
 5   free sulfur dioxide   1599 non-null   float64
 6   total sulfur dioxide  1599 non-null   float64
 7   density               1599 non-null   float64
 8   pH                    1599 non-null   float64
 9   sulphates             1599 non-null   float64
 10  alcohol               1599 non-null   float64
 11  quality               1599 non-null   int64  
dtypes: float64(11), int64(1)
memory usage: 150.0 KB
```
 - **量的データの基本統計量**

`DataFrame.describe()`とすることで量的データの[基本統計量](https://www.trunktools.jp/services/analysis/basis.html)を出力できます。量的データとは数字の大小に意味があるデータです。(ex. 身長,体重,値段...)

```py
winequality_data.describe()
```
>出力結果
![スクリーンショット 2021-12-02 22.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495396/55799fdf-f7eb-978c-7b5b-10efb6e8389a.png)

 - **欠損値の確認**

`DataFrame.isnull().sum()`とすることで各列の欠損値(nan)の数を出力できます。
 
```py
winequality_data.isnull().sum()
```
```出力結果.
fixed acidity           0
volatile acidity        0
citric acid             0
residual sugar          0
chlorides               0
free sulfur dioxide     0
total sulfur dioxide    0
density                 0
pH                      0
sulphates               0
alcohol                 0
quality                 0
dtype: int64
```
---

####5.3 データの加工
 - **転置**

`DataFrame.T `とすることで行と列を入れ替えることができます。
 
```py
dataframe
```
>出力結果

>| |  student ID  |  nativeplace  |  age  |  name  |
|:---: | :---:  | :---: | :---:  | :---: |
|0|  19001  |  Tokyo  |  20  |  Kota  |
|1|  19002  |  Kyoto  |  22  |  Yuki  |
|2|  19003  |  Fukuoka  |  43  |  Tomoshi  |
|3|  19004  |  Hokkaido  |  19  |  Kaito |

```py
dataframe.T
```
>出力結果

>| |  0  |  1  |  2|  3  |
|:---: | :---:  | :---: | :---:  | :---: |
|student ID|  19001  |  19002  |  19003  |  19004  |
| nativeplace|  Tokyo  |  Kyoto  |  Fukuoka  |  Hokkaido  |
| age|  20  |  22  |  43  |  19  |
|name|  Kota  |  Yuki  |  Tomoshi  |  Kaito |

 - **特定列の抜き出し** 
 
DataFrame['`抜き出したい列名(column)`']
もしくは
DataFrame.`抜き出したい列名(column)`

とすることで抜き出すことができます。
 
1列の抜き出し

```py
dataframe['student　ID']
```

```出力結果.
0    19001
1    19002
2    19003
3    19004
Name: student　ID, dtype: object
```
複数列の抜き出し

```py
dataframe[['student　ID','age']]
```


>出力結果

>| |  student　ID    |  age  |
|:---: | :---:   | :---:  |
|0|  19001    |  20  |
|1|  19002    |  22  |
|2|  19003   |  43  |
|3|  19004    |  19  |

複数列を抜き出す場合は括弧を2重にする必要があります。

DataFrame.`抜き出したい列名(column)` の場合も使い方は基本同じですが、columnにスペースが含まれている場合やcolumnの先頭が数字の場合などは使えないので注意してください。

```py
dataframe.student　ID
```

```出力結果.
  File "<ipython-input-48-e3d441d2246b>", line 1
    dataframe.student　ID
                     　 ^
SyntaxError: invalid character in identifier
```

```py
dataframe.age
```

```出力結果.
0    20
1    22
2    43
3    19
Name: age, dtype: object
```

 - **特定行の抜き出し**

 `DataFrame[i:j]` ( i ≦ 抜き出したい行のindex < j )とすることで任意の行を抜き出せます。
例えばindexが1の行を抜き出したい場合はDataFrame[1:2] となります。

```py
dataframe[1:2]
```

>出力結果

>| |  student ID  |  nativeplace  |  age  |  name  |
|:---: | :---:  | :---: | :---:  | :---: |
|1|  19002  |  Kyoto  |  22  |  Yuki  |

i,jの値を変更することで複数行の抜き出しも可能です。
また、indexが文字の場合は`DataFrame['index_a':'index_b']`とすることで抜き出し可能です。この場合`index_b`の行まで抜き出されます。

```py
dataframe_eng = pd.DataFrame(data,index=['A','B','C','D'])
dataframe_eng 
```

>出力結果.

>| |  student ID  |  nativeplace  |  age  |  name  |
|:---: | :---:  | :---: | :---:  | :---: |
|A|  19001  |  Tokyo  |  20  |  Kota  |
|B|  19002  |  Kyoto  |  22  |  Yuki  |
|C|  19003  |  Fukuoka  |  43  |  Tomoshi  |
|D|  19004  |  Hokkaido  |  19  |  Kaito |
```py
dataframe_eng['B':'C']
```

>出力結果.

>| |  student ID  |  nativeplace  |  age  |  name  |
|:---: | :---:  | :---: | :---:  | :---: |
|B|  19002  |  Kyoto  |  22  |  Yuki  |
|C|  19003  |  Fukuoka  |  43  |  Tomoshi  |

- **特定の行&特定の列の抜き出し**

任意の行,任意の列を抜き出す機能として`DataFrame.loc` , `DataFrame.iloc` があります。
`iloc`は`loc`のindex活用版になります。
いずれも`DataFrame.(i)loc[抜き出したい行範囲 , 抜き出したい列範囲]`　とすることで抜き出しができます。
`DataFrame.iloc`の場合は範囲指定にindexのみが使用できます。

```py
dataframe.loc[1:3, ['nativeplace' , 'age']]
```

>出力結果.

>| |  nativeplace  |  age  |
|:---: | :---:  | :---: | :---:  | :---: |
|1|  Kyoto  |  22  | 
|2|  Fukuoka  |  43  |
|3|  Hokkaido  |  19  |

```py
dataframe.iloc[1:4,1:3]
```
>出力結果.

>| |  nativeplace  |  age  |
|:---: | :---:  | :---: | :---:  | :---: |
|1|  Kyoto  |  22  | 
|2|  Fukuoka  |  43  |
|3|  Hokkaido  |  19  |

ilocで範囲指定する場合、範囲の右側は含まれないので注意が必要です。

```py
dataframe.iloc[:,1:3]
```

>出力結果

>|  |  nativeplace  |  age  |
|:---: | :---:  | :---: | :---:  |
|0  |  Tokyo  |  20  |
|1  |  Kyoto  |  22  | 
|2  |  Fukuoka  |  43  |
|3  |  Hokkaido  |  19  |
範囲指定の際に`:`とすることで全範囲(今回は全ての行)を指定できます。

 - **条件を満たすデータの抽出**

`DataFrame[条件式]` とすることで条件を満たすデータのみを抽出できます。

```py
dataframe[ dataframe['age'] > 20 ]
```

>出力結果

>| |  student ID  |  nativeplace  |  age  |  name  |
|:---: | :---:  | :---: | :---:  | :---: |
|1|  19002  |  Kyoto  |  22  |  Yuki  |
|2|  19003  |  Fukuoka  |  43  |  Tomoshi  |

and( & ) , or( | )を用いて抽出することもできます。

```py
dataframe[ (dataframe['age'] >= 20) | (dataframe['nativeplace'] =='Fukuoka') ]
```
>出力結果

>| |  student ID  |  nativeplace  |  age  |  name  |
|:---: | :---:  | :---: | :---:  | :---: |
|0|  19001  |  Tokyo  |  20  |  Kota  |
|1|  19002  |  Kyoto  |  22  |  Yuki  |
|2|  19003  |  Fukuoka  |  43  |  Tomoshi  |

#6. おわりに
拙い文章ですが最後まで読んでいただきありがとうございました。
何かの役に立てば幸いです。