[python3] 非IT業務でも使える pandas の基本的な使い方

## はじめに
高度な機械学習用のデータ分析などに利用されているpandasですが、直感的で簡単にデータを操作できるため、高度な利用だけでなく、日々の業務にも利用できるんじゃ無いかと思い、備忘録として基本的操作をまとめます。
勉強中ですのでどんどん更新していきます。

エクセルやcsvファイルに入っているデータを読み出して、計算したり、ちょっとしたグラフ作成したりできます。表計算（エクセル）はどんな仕事でも使うと思うので、簡単な使い方を理解するだけですぐ利用できます。

また、時系列データの操作にも強いので、株価データの取り扱いなど様々なことに応用できるかと思います。

**データ操作の学習には、jupyter notebookを利用することをお勧めします。**

## インストール
```console:
$ pip3 install pandas
```


## インポート
pd としてインポートするのが慣例。

```python:
import pandas as pd
```




## DataFrameの作成
① 値のリストを渡して、カラム名もリストで指定

```python:create_df1.py
import pandas as pd


df = pd.DataFrame([[1, 2, 3], [2, 4, 6], [3, 6, 9]],
                  columns=['column1','column2','columns'])
# インデックス名（行名）を指定したい際は、同様に、index=['index1','index2', 'index3']を追加する。

print(df)
```
② カラム名をキーとした辞書を渡すことも可能。

```python:create_df2.py
import pandas as pd

df = pd.DataFrame({
        'column1': [1, 2, 3],
        'column2': [2, 4, 6],
        'column3': [3, 6, 9],
     })

print(df)
```
どちらも結果は以下のようになる。

```console:結果
   column1  column2  column3
0        1        2        3
1        2        4        6
2        3        6        9
```




## CSVデータとして保存

```python:
df.to_csv('test.csv')
```





## CSVを読み込んで、列名/行名を取得
pandasはデフォルトで自動的にcsvファイルの1行目をカラム名として読んでくれる。（便利）
インデックスは、0,1,2,..と自動で付与される。

```python:
import pandas as pd

# 読み込みは、read_csvをつかう。
df = pd.read_csv('test.csv')

# インデックスオブジェクトを返す。
print(df.columns)

# リストを返す
print(df.columns.values)
```
行名が欲しい場合は、"columns"を"index"にする。

```terminal:結果
# インデックスオブジェクト
Index(['column1', 'column2', 'column3'], dtype='object')

# リスト
['column1', 'column2', 'column3']
```

※ Headerがない（列名が無いファイル）を読み込む際は、引数header=Noneを追加すると列名にも自動で、0,1,2,..と付与される。

```python:
pd.read_csv('test.csv', header=None)
```


### CSV以外の各種データの読み込み

```python:read_data
# Excelファイル
# デフォルトでは1番目のシートを読み出すが、指定可能。
pd.read_excel('test.xlsx')
pd.read_excel('test.xlsx', sheetname='Sheet3')

# sql
pd.read_sql('SELECT * FROM test', conn)

# json
pd.read_json('test.json')

# tsv(2通り。どちらでも可能)
pd.read_table('test.tsv')
pd.read_csv('test.tsv', sep='\t')
```



## データフレームの操作

### 上からor下から指定行数分取り出す
行数を指定しなければ、デフォルトで5行分表示される。

```python:
# 上から2行分
df.head(2)
# 下から2行分
df.tail(2)
```

### データフレームの行数、列数を確認する
タプル型で行数、列数が返ってくる。

```python:
df.shape
# => (3, 3)
```


### 行と列の入れ替え

```python:
df.T
```


### 特定の行の値を取り出す

色々やり方ありますが、下記は、df[カラム名]で取り出す方法。

```python:
df['column1']
```

```console:結果
   column1
0        1
1        2
2        3
```


### 特定の範囲の値を取り出す
.locを使う。
indexの"0"と"2"の、columns"1~2"を取り出す。

```python:
df.loc[[0, 2],0:2] 
```

```console:結果
   column1 column2
0        1       2
2        3       6 
```

### 列名を変更する

```python:
df = df.rename(columns={'column1':'col1', 'column2':'col2'})
```

```console:結果
      col1     col2  column3
0        1        2        3
1        2        4        6
2        3        6        9
```

### 行を削除する
```python:
# index=1の行を削除
df = df.drop('1', axis=0) # axis=0は書かなくてもOK
```

### 列を削除する
```python:
# 'column3'の列を削除
df = df.drop('column3', axis=1)
```

### 各列の型を調べる
```python:
df.dtypes
```


### 特定の列をインデックスにする

```python:
df.set_index['column2']
```



## 統計的メソッド

```python:各行の平均
df.mean()
```

```console:結果
column1    2.0
column2    4.0
column3    6.0
```

```python:データフレーム全ての値の平均
df.mean().mean()
```

```console:結果
4.0
```

### 他各種統計的メソッド

```python:
# 合計
df['column2'].sum()
# 中央値
df['column2'].median()
# 最小値
df['column2'].min()
# 最大値
df['column2'].max()
# 標準偏差
df['column2'].std()
# 分散
df['column2'].var()
# 欠損値を除いたデータ数
df['column2'].count()
# 最頻出するデータの値
df['column2'].top()
# 最頻出するデータ数
df['column2'].freq()
```






### データをソートする
列名を指定して、降順/昇順をFalse/Trueで指定

```python:

df.sort_values('column3', ascending=False)
```



## groupbyメソッド
下記のようなデータフレームがあるとする。（各年各月の支出)
groupbyメソッドを利用することで、各年毎や各月毎の合計支出や平均支出といった統計が取れる。

df_pay

| | 年 | 月 | 食費 | 娯楽 | 家賃 |
|:--|:--|:--|:--|:--|:--|
| 0 | 2014 | 1 | 30000 | 35000 | 80000 |
| 1 | 2014 | 2 | 32000 | 28000 | 80000 |
|...  |...   |...  |... |... |... |
| 46 | 2018 | 11 | 32000 | 42000 | 100000 |
| 47 | 2018 | 12 | 35000 | 40000 | 100000 |


```python:
# 各年毎の各種支出の合計
# 各月毎なら'年'を'月'に
df_pay.groupby('年').sum()
```
```console:
       月      食費      娯楽      家賃
年
2014   78   372000    342000    960000
2015   78   342000    332000    960000
2016   78   352000    384000    960000
2017   78   412000    372000   1200000
2018   78   382000    400000   1200000
```
他の各種統計的メソッドももちろん利用可能

```python:
# 平均値
df_pay.groupby('年').mean()
# 中央値
df_pay.groupby('年').median()
# 最小値
df_pay.groupby('年').min()
# 最大値
df_pay.groupby('年').max()
# 標準偏差
df_pay.groupby('年').std()
# 分散
df_pay.groupby('年').var()
```