Pandasの使い方(Ver1.4.4)

![pandas_logo.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631404/11fc33b6-3837-34fd-f6c0-e33206228ca0.jpeg)

## Pandasとは
pandasとは、**データ分析用ライブラリ**です。
pandasを使うと、Excelなどのファイルから表形式のデータを読み込み、集計、データ抽出、グラフの表示などが行えます。

##  Pandasのインポート

pandasを使うにはNumpyと同じように**インポート**する必要があります。numpyの時と同じように`as pd`として簡単化します！

```python
import pandas as pd
```

##  Pandasのデータ型
Pandasのデータ型は2つあります。
**Series型**と**Dataframe型**と呼ばれるものです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631404/80c3f38c-9d90-17c4-983e-0afceea39c71.png" width="70%">



### Series型
Seriesは基本**一行のデータ**を扱います。
実際に以下のコードを実行してSeries型データを生成してみましょう。
```python
a = pd.Series([2, 3, 4, 5])
a
```

<details><summary>実行結果</summary>

```python
0    2
1    3
2    4
3    5
dtype: int64
##データ型
```
</details>

また、Numpy同様**インデックス番号の指定**により要素を抽出できます。
実際に、以下のコードを実行してみてください。

```python
a[0]
```

<details><summary>実行結果</summary>

```python
2
```
</details>

Series型は数値だけでなく、文字列など様々な値を格納することができること合わせて覚えておきましょう。

###  Dataframe型
DataFrameは、データをExcelのような表形式で表現することができます。
#### DataFrameの作り方


まず、Numpy配列を基にDataframeを作ります。以下のコードを実行してDataframeを作ってみましょう。

```python
import numpy as np
col_1 = np.array(['A', 'B', 'A', 'C', 'D'])
col_2 = np.array([1, 2, 3, 4, 5])
col_3 = np.array([3, 6, 7, 8, 2])
##各行の定義
df =pd.DataFrame({'col_1':col_1, 'col_2':col_2, 'col_3':col_3})
##カラム名をつけてDataframeをつくる
```
##### <実行結果>
<img src="https://storage.googleapis.com/geeksalon-textbook-storage/deed6fb7-71e9-1685-609a-0cd79f89b955.png" width="35%">


#### ファイルの読み込みによるDaraframeの作成

ファイル読み込みには`read_csv`を使います。これによりcsv形式のファイルをDataframeへと読み取ることができます。

:::note
大量のデータを扱う際には、打ち込みミス等が考えられるのでデータファイルを読み込む方法が好ましいです。
:::
まず、以下のCSVファイルをダウンロードしてグーグルドライブに移動してください。
[Sample1.csv](https://drive.google.com/file/d/1YH94J2uGRyiZik6yMGEujV3YVFmhlCzz/view)
##### やり方
前述のリンクをクリックした後、以下のようにドライブにショートカットを作成すればOKです！
![スクリーンショット 2023-04-23 163653.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631404/1669d3e5-7d97-623f-30a3-8d32cc43c1bd.png)

そして次のコードをコラボ上で実行しましょう！
```python
from google.colab import drive 
drive.mount('/content/drive')
sample =  pd.read_csv("/content/drive/MyDrive/sample.csv") 
sample
```
その後次の手順でCSVファイルの中身を読み取っていきます。
>1．実行すると、URLが出てくるのでそれをクリック
>2. するとブラウザが開きログインする画面になるので自分のGoogleアカウントでログイン
>3. ログインできるとパス（文字列）が出てくるのでそれをコピー
>4. コラボに戻ってコピーしたパスを入力欄に入れる

これで準備完了です！ゼミでの演習でも行う重要な手順なのでぜひ一度やってみてください！


#### Dataframeの抽出
実際データ分析などをする際には、データをいじったりして加工をしたりします。そのため、データの確認のため、データ
を1行（1列）などで取り出す必要があります。
ここからは、Dataframeからデータを抽出する方法を説明します。

#### 1行・1列抽出

行で取り出すときと列で取り出す時で書き方が違うので注意しましょう。やり方は以下のようになります。

>`df名.行名`または`df名[行名]`と書くと**行抽出**できる。
>`df名.列名`または`df名[列名]`と書くと**列抽出**できる。

では、以下のDataframeを作成し、データの抽出に挑戦しましょう！余力のある人はインデックス番号を英語(A～E)に変更してみましょう！

<img src="https://storage.googleapis.com/geeksalon-textbook-storage/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%20(82).png" width="33%">

<details><summary>答え</summary>


```python
##インデックス変更なし
col_1 = np.array([70, 78, 65, 87, 90])
col_2 = np.array([81, 72, 83, 94, 72])
col_3 = np.array([73, 86, 87, 68, 92])
df =pd.DataFrame({'国語':col_1, '数学':col_2, '英語':col_3})
```
```python
##インデックス変更あり
df = pd.DataFrame({'国語': [70, 78, 65, 87, 90],
                   '数学': [81, 72, 83, 94, 72],
                   '英語': [73, 86, 87, 68, 92]},
                  index=['A', 'B', 'C','D', 'E'])
```
</details>

続いて、以下のコードでどの箇所が抽出されるか、予想してみてください！
```python
df['国語']
```
<details><summary>答え</summary>

```python
A    70
B    78
C    65
D    87
E    90
Name: 国語, dtype: int64
```
</details>

```python
df.国語
```
<details><summary>答え</summary>

```python
A    70
B    78
C    65
D    87
E    90
Name: 国語, dtype: int64
```
</details>


```python
df[:1]
```
<details><summary>答え</summary>

```python
   国語  数学  英語
A  70  81  73
##0行目を抽出できる
```

</details>

```python
df[1:3]
```
<details><summary>答え</summary>

```python

国語	数学	英語
B	78	72	86
C	65	83	87
##1,2行目を抽出できる(1行目以上3行目未満を抽出)
```

</details>

値を変えて思い通りに抽出ができるよう練習してみましょう！


## メソッドを用いた抽出

### locとiloc
1行と1列以外で取り出す以外にも、ある特定の1つのデータを取り出したいときがありますよね。
そんなときに`iloc`と`loc`を使う方法があります。以降、詳しく見ていきます。

#### iloc
`iloc`は**indexを指定**することで特定の値を抽出できます。つまり、行、列を番号で指定します。

```python
df.iloc[2]
##行番号が2の行を抽出(番号は0スタートであることに注意)
```
```python
df.iloc[: , 1]
##列番号が1の列を抽出
```


#### loc
`loc`は**名前を指定**することで特定の値を抽出できます。

それではやっていきましょう。

```python
df.loc['B']
##名前がBの行を抽出
```

```python
df.loc[:, '国語']
##名前が国語の列を抽出
```

行に指定がない場合には代わりに`:`を付けます。

#### 条件抽出(query)
`query()`では条件を出して抽出する事が可能です。

```python
df.query('数学 == 72 ')
##数学の点数が72点であるデータを抽出
```
#### 先頭・末尾の行の抽出
先頭の数行を抽出する際は、`head()`を使用します。


```python
print(df.head())
##先頭5行分抽出
```
```python
print(df.head(3))
##()内部の数だけ先頭から抽出
```
対して、末尾の数行を抽出するには`tail()`を使用します。
```python
print(df.tail())
##末尾5行分抽出
```

```python
print(df.tail(3))
###()内部の数だけ末尾から抽出
```


以上で抽出の主なやり方を紹介しました。実際に自分で手を動かして理解を深めていってください！　
ここからは表の並び替えや欠損値についてみていきます！

## 並び替え

データの並び変えなどをしたいときは`sort_values()`を使用します。
()内は並び替えたい列の名前、そして`ascending`で構成されています。
ascendingでは、`True`で**昇順**、`Flase`で**降順**でのソートができます。

![キャプチャ.PNG](https://cdn.discordapp.com/attachments/861862313782018052/1094152134964031598/image.png)

上記のDataframeを定義した後、以下のコードを実行するとどうなるでしょうか。
予測してみてから答えを見て確認してください！

```python
df.sort_values('数学', ascending=False)
```

<details><summary>答え</summary>

![キャプチャ.PNG](https://cdn.discordapp.com/attachments/861862313782018052/1094151936741228544/image.png)

</details>

このように数値の降順(大きい順)に並び替えできます。

また、以下のようなコードを実行するとアルファベット順での並び変えも可能です。
こちらも予想してみてください！

```python
df.sort_values('名前', ascending=True)
```

<details><summary>答え</summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631404/67c9f5da-2d39-c8bc-baec-09cfe519a44e.png)

</details>

数字に限らず文字に関しても並び替えが可能なので便利ですね！！

## 基礎統計

`describe()` を使用することで、各カラムの**平均値**や**標準誤差**、**四分位数**といった記述統計量を求めることができます。

:::note
 似たようなメソッドに``info()`` がありますが、これは各カラムにnullがいくつあるか、データ型、使用メモリといったものを出力してくれます。
:::
## 欠損値処理

:::note 
欠損値について
`欠損値`とは、Dataframeにおいて**空白となっている部分**のことです。これがあると**並び替え**や**統計をもとめる**ことができなません。なので、データ分析の前処理で**欠損値を外す**、あるいは**別の値で埋める**といった処理をよく行います。もっと詳しく知りたい人は下のリンクを見てください。
:::

参考）[欠損値とは](https://docs.pyq.jp/python/pydata/nan.html)

欠損値を外したい場合は`dropna()`、欠損値を置換したい場合は`replace()`と`fillna()`を使用します。

それでは実際にコードを実行して確かめてみましょう。まず、以下のコードを実行してDataframeを定義します。
```python
import numpy as np
import pandas as pd
col_1 = np.array(['A', 'B', 'E', 'C', 'D'])
col_2 = np.array([78, 86, 61, "不明", 85])
col_3 = np.array([89, 77, "不明", 75, 80])
df =pd.DataFrame({'名前':col_1, '数学':col_2, '英語':col_3})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631404/3eddca0c-ecbe-547e-3ef7-cf254274467e.png)

この不明という値を`replace()`で欠損値に置き換えます。
実行してみましょう。
```python
df = df.replace('不明' , np.nan)
df
##確認
```
これにより不明となっていた部分がNANに置き換わったはずです。
このNaNが欠損値です。欠損値は`dropna()`と`fillna()`により操作が可能です。

#### dropna()
`dropna()`では欠損値のある行を消去することができます。実行してみると、、

```python
df.dropna()
```
###### <実行結果>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631404/7db0914d-7fbd-87c9-9cb5-cb9c5af32bd3.png)
確かに、NaNを含む2,3行目が消去されてますね。

#### fillna()
`fillna()`は欠損値を()に入れた値に変えることができます。
実行してみると、、
```python
df.fillna(100)
```
###### <実行結果>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631404/b32cf9a1-34c5-3f6a-efb4-c0d390c5324d.png)
と、欠損値を100に変換できています。

#### replace
`replace(a,b)`は**aをbに置き換える**ことができます。
これにより、不明となる値を一気に100に変えることができます。
```python
df = df.replace('不明' , 100)
df
```
`dropna()`と`fillna()`を一括で行ってると考えてもらって大丈夫です！


## 最後に
以上がpandasの使い方、できることの紹介でした。

前節で紹介したnumpyとセットで使われるたり、CSVファイルから読み込みでからのDataframeの作成は後の機械学習等でも使用するので実際に自分で手を動かしてみたりして慣れておいてください！

紹介したコードの実行結果をまとめたコラボがあるので是非、学習に活用してください！
[pandasコラボ教材](https://colab.research.google.com/drive/18p1BMZ4A2az0r1fxrcM5r2hSXjM7DMuh?usp=sharing)
使用の際は、必ず自分のドライブにコピーしてから使用してください！

紹介した物以外でもPandasでできることは沢山ありますので気になる人はPandasの公式ドキュメント等を確認してください！