機械学習で必要となる配列の扱い方をまとめてみた（主にpandas）

Tensorflowなどのフレームワークにデータを投入するのには、データのクレンジングが必要です。
そこで必要となるpandasの使い方についてまとめてみました。
（特に自分が必要だと思った機能だけ）

今後も便利な機能を見つけたら追記していきます。
## ヘッダ
先頭に以下のimportを記述します。

```python
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
import numpy as np
```
##データ読み込み
###CSVから読み込む
読み込みたいファイルのパスを指定することで、csvファイルを簡単に読み込むことができます。

```python
df = pd.read_csv("path/to/target.csv")
```

###配列で定義する
```python
data = [
              ['昭和区滝川町', 30,'マンション','2000',18000000], 
              ['昭和区滝川町', 80,'マンション','2000',34000000], 
              ['昭和区滝川町', 100,'マンション','2000',50000000], 
              ['昭和区滝川町', 60,'マンション','2010',38000000],
              ['昭和区滝川町', 80,'土地','', 24000000], 
              ['昭和区滝川町', 150,'一戸建て','2000',80000000], 
              ['昭和区滝川町', 60,'マンション','2010',38000000],
              ['昭和区山里町', 60,'マンション','2000',18000000], 
              ['昭和区山里町', 80,'一戸建て','2000',24000000], 
              ['昭和区山里町', 100,'マンション','2009',40000000], 
              ['昭和区山里町', 60,'マンション','2010',28000000],
              ['昭和区山里町', 80,'土地','',14000000], 
              ['昭和区山里町', 150,'一戸建て','2018',70000000], 
              ['昭和区山里町', 40,'マンション','2004',15000000] 
       ] 
#定義したデータにヘッダを付けて読み込む
df = pd.DataFrame(data, columns = ['town_name', 'size','type','build_year','price']) 
```
以降、変数dfに上記の値がデータフレーム形式で読み込まれている前提で例を示します。

##列操作
### 列をコピーする
####一列コピー
```python
ulti_columns = df[['price']]
```
変数priceの値

|  | price |
|--:|--:|
| 0 | 28000000 |
| 1 | 34000000 |
| 2 | 50000000 |
| 3 | 38000000 |
| 4 | 24000000 |

####複数行コピー
```python
multi_columns = df[['price','size']]
```
変数multi_columnsの値はこんな感じになります。

| | price | size |
|--:|--:|--:|
| 0 | 28000000 | 60 |
| 1 | 34000000 | 80 |
| 2 | 50000000 | 100 |
| 3 | 38000000 | 60 |
| 4 | 24000000 | 80 |


### 列を抜き出す
指定した列をdataframeから抜き出します。（抽出元からはここで指定したカラムは削除されます。）

```python
price_column = df.pop('price')
```

### 列を消す
指定した列名を持つ列を削除します。

```python
f.__delitem__('price')
```

### 列を追加する
####同じ値を埋めて列追加
以下の様に記述するとdataframeにnew_column2という列が追加され、すべての値は'new value'となります。

```python
df['new_column2']  = 'new value'
```
####条件に合わせて値を変えて列追加
条件に合わせて値を変えたい場合は以下の様に記述します。

#####２つの条件を指定する場合
条件が２つだけの時は、以下の様に記述できます。

```python
import numpy as np
df['town_part_of'] = np.where(df['town_name']=='昭和区滝川町', '北部', '南部')
```
結果

|  | town_name | size | type | build_year | price | town_part_of |
|--:|:--|--:|:--|:--|--:|:--|
| 0 | 昭和区滝川町 | 60 | マンション | 2000年 | 28000000 | 北部 |
| 1 | 昭和区滝川町 | 100 | 一戸建て | 2000年 | 80000000 | 北部 |
| 2 | 昭和区山里町 | 60 | マンション | 2000年 | 18000000 | 南部 |
| 3 | 昭和区山里町 | 80 | マンション | 2000年 | 24000000 | 南部 |	

#####２つ以上の条件を指定する場合

```python

conditions = [
    (df['size'] <= 50) & (df['type'] == 'マンション'),
    (df['size'] <= 100) & ((df['type'] == 'マンション')|(df['type'] == '一戸建て')),
    (df['size'] > 100)
]
choices = ['一人暮らし用', '４人家族用', '２世帯用']
df['category'] = np.select(conditions, choices, default='不明')
print(df)
```

|  | town_name | size | type | build_year | price | town_part_of | category |
|--:|:--|--:|:--|--:|--:|:--|:--|
| 0 | 昭和区滝川町 | 30 | マンション | 2000 | 18000000 | 北部 | 一人暮らし用 |
| 1 | 昭和区滝川町 | 80 | マンション | 2000 | 34000000 | 北部 | ４人家族用 |
| 2 | 昭和区滝川町 | 100 | マンション | 2000 | 50000000 | 北部 | ４人家族用 |
| 3 | 昭和区滝川町 | 60 | マンション | 2010 | 38000000 | 北部 | ４人家族用 |
| 4 | 昭和区滝川町 | 80 | 土地 |  | 24000000 | 北部 | 不明 |
| 5 | 昭和区滝川町 | 150 | 一戸建て | 2000 | 80000000 | 北部 | ２世帯用 |
| 6 | 昭和区滝川町 | 60 | マンション | 2010 | 38000000 | 北部 | ４人家族用 |
| 7 | 昭和区山里町 | 60 | マンション | 2000 | 18000000 | 南部 | ４人家族用 |
| 8 | 昭和区山里町 | 80 | 一戸建て | 2000 | 24000000 | 南部 | ４人家族用 |


#行操作
### 行を追加する
行を追加する場合は、appendを使って列名と値をセットで指定する。指定しなかった列はNaN（値未設定）となる

```python
df.append({'town_name' : '東区東新町' ,'size': 99, 'type' : 'マンション','build_year':'2011年','price':77000000} , ignore_index=True)
```
### 行を消す
0番目と１番目の行を消す

```python
df = df.drop(df.index[[0,1]])
```

###特定のカラムに入っている特定のデータを除外する
typeが土地のデータを除外する

```python
df = df[df.type != '土地']
```

### 行を抜き出す

####１つのデータと合致するものを抽出
```python
df.loc[df.type == 'マンション']
```

#### 複数のデータと合致するものを抽出
マンションまたは土地を抽出する

```
array = ['マンション', '土地']
df.loc[df['type'].isin(array)]
```
#### 指定行のデータを抽出する
0から３行目までのデータを抽出

```
df.iloc[0:3]
```

####行と列を指定してデータを抽出する
０行目から５行目のでデータをsizeからpriceにまで絞って抽出

```python
df.loc[ 0:5,'size' : 'price' ]
```

### 行をシャッフルする

```
df.sample(frac=1).reset_index(drop=True)
```

### データを分割する
トレーニングデータとテストデータに分割するときなどに利用する

```python

#データを８：２に分ける
train_dataset = df.sample(frac=0.8,random_state=0)
#train_datasetに含まれているデータを削除する
test_dataset = df.drop(train_dataset.index)
```

動作するコードは以下にあります
https://colab.research.google.com/drive/1J4nPzvY8wtf1EdKBc5OBW1Umj7gUwNv6



参考ページ：
https://thispointer.com/select-rows-columns-by-name-or-index-in-dataframe-using-loc-iloc-python-pandas/