Tensorflowなどのフレームワークにデータを投入するのには、データのクレンジングが必要です。
そこで必要となるpandasの使い方についてまとめてみました。
(特に自分が必要だと思った機能だけ)
今後も便利な機能を見つけたら追記していきます。
ヘッダ
先頭に以下のimportを記述します。
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
import numpy as np
データ読み込み
CSVから読み込む
読み込みたいファイルのパスを指定することで、csvファイルを簡単に読み込むことができます。
df = pd.read_csv("path/to/target.csv")
配列で定義する
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に上記の値がデータフレーム形式で読み込まれている前提で例を示します。
列操作
列をコピーする
一列コピー
ulti_columns = df[['price']]
変数priceの値
price | |
---|---|
0 | 28000000 |
1 | 34000000 |
2 | 50000000 |
3 | 38000000 |
4 | 24000000 |
複数行コピー
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から抜き出します。(抽出元からはここで指定したカラムは削除されます。)
price_column = df.pop('price')
列を消す
指定した列名を持つ列を削除します。
f.__delitem__('price')
列を追加する
同じ値を埋めて列追加
以下の様に記述するとdataframeにnew_column2という列が追加され、すべての値は'new value'となります。
df['new_column2'] = 'new value'
条件に合わせて値を変えて列追加
条件に合わせて値を変えたい場合は以下の様に記述します。
2つの条件を指定する場合
条件が2つだけの時は、以下の様に記述できます。
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 | 南部 |
2つ以上の条件を指定する場合
conditions = [
(df['size'] <= 50) & (df['type'] == 'マンション'),
(df['size'] <= 100) & ((df['type'] == 'マンション')|(df['type'] == '一戸建て')),
(df['size'] > 100)
]
choices = ['一人暮らし用', '4人家族用', '2世帯用']
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 | 北部 | 4人家族用 |
2 | 昭和区滝川町 | 100 | マンション | 2000 | 50000000 | 北部 | 4人家族用 |
3 | 昭和区滝川町 | 60 | マンション | 2010 | 38000000 | 北部 | 4人家族用 |
4 | 昭和区滝川町 | 80 | 土地 | 24000000 | 北部 | 不明 | |
5 | 昭和区滝川町 | 150 | 一戸建て | 2000 | 80000000 | 北部 | 2世帯用 |
6 | 昭和区滝川町 | 60 | マンション | 2010 | 38000000 | 北部 | 4人家族用 |
7 | 昭和区山里町 | 60 | マンション | 2000 | 18000000 | 南部 | 4人家族用 |
8 | 昭和区山里町 | 80 | 一戸建て | 2000 | 24000000 | 南部 | 4人家族用 |
行操作
行を追加する
行を追加する場合は、appendを使って列名と値をセットで指定する。指定しなかった列はNaN(値未設定)となる
df.append({'town_name' : '東区東新町' ,'size': 99, 'type' : 'マンション','build_year':'2011年','price':77000000} , ignore_index=True)
行を消す
0番目と1番目の行を消す
df = df.drop(df.index[[0,1]])
特定のカラムに入っている特定のデータを除外する
typeが土地のデータを除外する
df = df[df.type != '土地']
行を抜き出す
1つのデータと合致するものを抽出
df.loc[df.type == 'マンション']
複数のデータと合致するものを抽出
マンションまたは土地を抽出する
array = ['マンション', '土地']
df.loc[df['type'].isin(array)]
指定行のデータを抽出する
0から3行目までのデータを抽出
df.iloc[0:3]
行と列を指定してデータを抽出する
0行目から5行目のでデータをsizeからpriceにまで絞って抽出
df.loc[ 0:5,'size' : 'price' ]
行をシャッフルする
df.sample(frac=1).reset_index(drop=True)
データを分割する
トレーニングデータとテストデータに分割するときなどに利用する
#データを8:2に分ける
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