pandasの使い方

pandasの機能と使い方について、使用したものを整理する。

#CSVファイル読み込み
pandas.read_csv()

使用できる引数は[マニュアル](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)参照。
主な引数は[このページ](https://pythondatascience.plavox.info/pandas/csv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF)参照。

```python:サンプル
import pandas as pd
train = pd.read_csv('../train.csv')
```

#CSVファイル出力
to_csv()を使用。

参考は[このページ](https://qiita.com/okadate/items/c36f4egit push origin masterb9506b358fb608#3-pandas%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%E3%81%8A%E3%81%99%E3%81%99%E3%82%81)。

```python:サンプル
import pandas as pd
train = pd.read_csv('../train.csv')

#行名の出力が不要の場合は、index=Falseを指定する(defaultはTrue)
train.to_csv('train.csv', index=False)
```


#欠損値の有無の確認
参考は[このページ](https://qiita.com/TomokIshii/items/c7c704f22edfebf7f133)。

pandasのデータフレームに対して、isnull()とany()を使用する。
isnull()は項目が欠損値かどうかを判断し、any()は全体をみて真偽を返す。
カラム全体で欠損値が含まれるかどうか判断するには以下のサンプルのように使用する。

```python:サンプル
import pandas as pd
train = pd.read_csv('../train.csv')
train.isnull().any(axis=0)
#（列方向を指定するためのanyの「axis=0」はデフォルトなので省略可）
```
以下のように返ってくる。
PassengerId    False
Survived       False
Pclass         False
Name           False
Sex            False
Age             True
SibSp          False。
Parch          False
Ticket         False
Fare           False
Cabin           True
Embarked        True
dtype: bool

欠損値の数を確認するにはany()の代わりにsum()を使用する。

```python:サンプル
import pandas as pd
train = pd.read_csv('../train.csv')
train.isnull().sum()
```

以下のように返ってくる。
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

#欠損値を補完する
参考は[このページ](https://qiita.com/ynakayama/items/2769bc92bb71ebf23be6)。
fillna()を使用する。

```python:サンプル
import pandas as pd
train = pd.read_csv('../train.csv')

#欠損値を0埋めする
train.fillna(0)
#欠損値を平均埋めする
train.fillna(train.mean())
```

#特定の列を取得する
参考は[このページ](https://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA)。

```python:サンプル
import pandas as pd
train = pd.read_csv('../train.csv')

#どちらも同じ結果になる
train['Age']
train.Age
```

#列の名称を変更
```python:サンプル
import pandas as pd
train = pd.read_csv('../train.csv')

#Aの列名をaに変更
train.rename(columns={'A': 'a'}
```

#特定の列を削除する
参考は[このページ](https://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA)。

```python:サンプル
import pandas as pd
train = pd.read_csv('../train.csv')

#Age列を削除
train.drop("Age", axis=1)
```


#条件を指定して特定の行を取得する
参考は[このページ](https://pythondatascience.plavox.info/pandas/%E8%A1%8C%E3%83%BB%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA)。

```python:サンプル
import pandas as pd
train = pd.read_csv('../train.csv')

#Ageが10以上のデータを抽出
train[train.Age >= 10]
```

#クロス集計表を作成する
参考は[このページ](http://noumenon-th.net/programming/2016/04/27/logisticregression/)。

```python:サンプル
import pandas as pd
train = pd.read_csv('../train.csv')

pd.crosstab(train['Sex'], train['Survived'])
```

| Survived | 0 | 1 |
|:--|--:|--:|
| Sex |  |  |
| female | 81 | 233 |
| male | 468 | 109 |

#ダミー変数を作成する
##ダミー変数とは
参考は[このページ](http://xica.net/magellan/marketing-idea/stats/abou-dummy-variable/)。
カテゴリデータを数値変換したもの。
カテゴリデータはダミー変数化することにより、説明変数として使用することができる。

##作成方法
参考は[このページ](https://qiita.com/haru1977/items/1d67b664f8b5ec48d507)。
get_dummies()を使用する。

```python:サンプル
import pandas as pd
train = pd.read_csv('../train.csv')

#「male」、「female」の値が格納されている性別項目をダミー変数化する
df_sex_dummy = pd.get_dummies(train['Sex'], prefix='Sex', drop_first=True)
```
以下の感じの結果になる。

|       Sex_male |
|------------------:|
|              1 |
|              0 |
|              1 |

「Sex_female」列が生成されないのは、drop_firstをTrueにしているから。
ダミー変数を作成するときには1つ目のカテゴリは多重共線性への対応から作成しないのが流儀。
多重共線性については以下参考。
[参考１](http://xica.net/vno4ul5p/)
[参考２](https://www.weblio.jp/content/%E5%A4%9A%E9%87%8D%E5%85%B1%E7%B7%9A%E6%80%A7)

#結合
参考は[このページ](http://pppurple.hatenablog.com/entry/2016/06/27/022310#join%E9%96%A2%E6%95%B0)。
join()を使用。
デフォルトではleft outer joinになるので注意。結合キーはindexになる。

```python:サンプル
#train_joinにtrain1とtrain2を結合したデータを格納。結合軸はtrain1
train_join = train1.join(train2)
```

```python:複数の結合条件
#結合条件をリストにする
merge_joken=('a', 'b', 'c')
train_join = pd.merge(train1, train2, on=merge_joken)
```

#PostgreSQLにテーブル作成
データフレーム内容でPostgreSQLに直接テーブルを作成する。


```python:サンプル
#dfはデータフレーム
import psycopg2
from sqlalchemy import create_engine

engine=create_engine("postgresql://username:password@hostname:port/dbname")

df.to_sql("table_name", engine, if_exists="replace", index=False)

```

#PostgreSQLのデータをデータフレームに投入

```python:サンプル
import pandas as pd
import psycopg2

# 接続情報
connection_config = {
    'host': '',
    'port': '',
    'database': '',
    'user': '',
    'password': ''
}

# 接続
connection = psycopg2.connect(**connection_config)

# DataFrameでロード
dataframe = pd.read_sql(sql="SELECT 〜;", con=connection)
```