python - pandas手始めにpandas.DataFrameで簡単に表をあれこれする

# pandasとは？
[Pandas公式ドキュメント](http://pandas.pydata.org/pandas-docs/stable/)
Pythonで作られた強力なデータ分析のためのツール（ライブラリ）
つまりデータの読み込み、集計、加工、絞り込みができるし、
ディープラーニング等にかける前のデータの`前処理`にも役立つ

# DataFrameとは？
pandasの機能の一部であるDataFrameを使うことで、２次元の表形式のデータを簡単に操作できる
（DataFrame以外にも１次元のデータを扱うSeriesというものもある）

- 簡単に操作できるってなんやねん？
  - 表形式のデータに対して、SQLチックに抽出、追加、加工、結合とかができちゃう
  - ファイルやDBなどからデータを読み込んでDataFrameに変換、出力とかできちゃう
  - pythonオンリーでやるとfor分でループして...ってなるけどもっとスマートにできちゃう

# 実際に触ってみよう
## まずはシンプルに
```sample_data.py
# 名前、身長、体重の入った２次元のリスト
sample_data = [['佐藤', 170, 60], ['田中', 160, 50], ['鈴木', 165, 58]]
```
これをテストデータとして表を作ってみる
ジャーン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/80c4fafc-f493-824a-3c96-de8ad79cd618.png)
なにこれすごく簡単・・・
`columns`オプションで項目名を設定できるんやなー　わかりやすい

表を作るだけだったらたったこれだけ！操作の方も見ていこう！

## 特定のデータを取り出す
### 列を抽出
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/7c91c68c-3e5c-ec01-e61f-f3789681696d.png)
でかでかとタイトルつけたけど、あっけない...w
さっき`columns`で指定したカラム名を指定するだけで抽出できる
簡単だ！ RubyのHashにアクセスする感じと似てる

### 列内の◯◯値
では、その抽出した列から最大（or最小）の値を取り出してみよう〜 MAX関数的な！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/56fd5979-100f-57a5-7137-dec8f3ca6600.png)
うん、`max`関数だった　　ちなみに最小は当たり前のごとく`min`で取れる

さらにちなんでおくと、平均値を出すには `mean` で出せる（`heights.mean()`）
合計は`sum`とか色々あるみたいだけど、全部は覚えられないから都度調べよう
Pandas公式： http://pandas.pydata.org/pandas-docs/stable/

## CSVからデータを読み込んでみる
### 表作成
使うメソッドは `pandas.read_csv()`
pandasのこのような`read_XXX`メソッドを使えば、データを読み込んでDataFrameに変換までやってくれる優しさ

```dataset/stationery.csv
Name,Price,Date
ボールペン,150,20210514
ノート,150,20210514
のり,100,20210514
のり,120,20210514
```
こんな感じの文房具リストをサンプルデータとすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/a4270a02-04e4-4dcc-7c7a-810abf2b7b54.png)
やば
長くなるから端折ったけど、めっちゃ行のあるcsvだと圧巻　爆速
csv読むときのおきまりの呪文である`encoding`の指定も忘れないようにしないとね

### 項目ごとにカウントする
じゃあ上の表から文房具名ごとの個数を表示しようってなったとき、
pythonでやるとfor文で回して、dictionary型の変数をカウントアップしていってってやるかな〜
pandasだと？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/95a3cab9-83f2-5667-27f3-82b0395fa691.png)
むせた
え、マジで。（わかりやすいようにサンプルデータ適当に増やしてます）

### group集計する
文房具ごとの値段の合計とかするやつ
同じくfor文でやるとカウントアップの代わりにprice足していくんだろうけど
`DataFrame.groupby()`を使うと超お手軽
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/054cb959-c59c-30c6-4f82-02d2607a3b1c.png)
なるほど〜 `groupby`でキーを指定して、それに対して`sum`するのはわかるんだけども
これDateはどうなってるんだろう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/3c7e65f2-8c63-51f8-c68e-fc64d62dff5e.png)
うんw　数値として足されてるだけだったw
まあsumでは使わない値だから関係ないけど！

### 列を追加する
csvから読んだデータから新しい列を動的に挿入する
これループでやろうと思ったら結構嫌やな〜w

```dataset/measurement.csv
Name,Height,Weight
佐藤,172,53
田中,160,50
鈴木,165,58
長谷川,160,65
```
このデータでいく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/4215f01b-d936-2a21-ed61-8bc5e9cd4531.png)
これにHeightのメートル表記の列を追加してみよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/98c8af35-726d-0c8c-ec09-9dad07961073.png)
マジかよ
（`df['Age'] = 18`とかやると前列同じ値で挿入される）

### 条件付きで絞り込み
こちらも単純で`df[条件式]`で絞り込める
上の表を以下の通り表示すると
`df[df['Weight'] >= 55]`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/f2a86e55-800b-62d8-b3b8-92925a2497e0.png)
この２件だけに絞り込める
条件複数指定：　`df[(df['Weight'] >= 55) | (df['Height'] <= 160)]`
※論理演算式がPythonみたいにand, orじゃないので気をつける！ `&`: and, `|`: or, `~`: not

# 感想
めっちゃ行数少ないぃぃ
個人的に感動したのは読み込んでから変換してくれるところ
これをサササッと使えこなせたらいい感じですねえ