私の方がKaggleには詳しくない感じではありますが、色々方法(方針)があると思われます!
例えば、
- 不正なデータの行数が少ないのであればその行を削除してしまう
- 不正なデータの列部分はそれなりにあるものの、他の列のデータは正常なデータが入っていたりで行の削除してしまうと学習データが結構減ってしまって適切ではない・・・といった場合には他の行の値の平均や中央値で補完する
など色々な方法があると思います!
説明のために以下のようなtrain_data
というデータフレームがあると想定して進めます!(コード見ていた感じ、train_data
という変数がデータフレームかな?と思いましたが、もし違っておりましたらご容赦ください)
サンプルとしてxは適当な値を設定しています。2行目のyが不正な文字列、3行目が欠損値としています。
import pandas as pd
import numpy as np
train_data = pd.DataFrame(
data=[{
'x': 1,
'y': 10,
}, {
'x': 2,
'y': 'Smoke detector',
}, {
'x': 3,
'y': np.nan,
}, {
'x': 4,
'y': 11,
}])
print(train_data)
x y
0 1 10
1 2 Smoke detecto
2 3 NaN
3 4 11
不正なデータの行を削除したいのであれば、こちらもコードの書き方が色々あると思いますが一例として以下のようなもので対応ができると思われます!
import pandas as pd
import numpy as np
train_data = pd.DataFrame(
data=[{
'x': 1,
'y': 10,
}, {
'x': 2,
'y': 'Smoke detecto',
}, {
'x': 3,
'y': np.nan,
}, {
'x': 4,
'y': 11,
}])
def is_valid(y):
try:
int(y)
except Exception:
return False
return True
train_data['is_valid'] = train_data['y'].apply(is_valid)
train_data = train_data[train_data['is_valid']]
del train_data['is_valid']
print(train_data)
整数変換ができる行(1行目と4行目)のみ残ります。
コードの説明ですが、まずy
の値(整数や欠損値などを受け付けます)を引数に取る関数(is_valid
)を設けまして、もし正常に整数変換(int(y)
)ができる場合にはTrue、変換ができずエラーになる場合にはFalseを返却するようにしてあります。
続いてデータフレームのapply
メソッドを使って作ったis_valid
関数をデータフレームに反映します(train_data['y'].apply(is_valid)
部分)。返却値はSeries(今回は列のデータ)となるため、そちらをtrain_data['is_valid']
といった感じにis_valid
という列に設定しています。
※applyメソッドなどについては以下の記事などをご参照ください。
この時点でtrain_data
の中身は以下のようになっています!
x y is_valid
0 1 10 True
1 2 Smoke detecto False
2 3 NaN False
3 4 11 True
続いてis_valid
の列がTrueの行のみ残せばよいので、train_data = train_data[train_data['is_valid']]
といった感じで指定してスライスを行っています。
このあたりの制御の詳細は必要に応じて以下の記事などをご確認ください。
最後にdel train_data['is_valid']
として、不要になったis_valid
列を削除しています!
※欠損値などの行を削除するのではなく、中央値やもしくは他の任意の値で補正したい場合は事前にその埋めたい値を算出しておいて、同じ感じでapplyメソッドなどを使うと実現できると思います!
例えば一例として以下のようなコードになるかなと思います。
import pandas as pd
import numpy as np
train_data = pd.DataFrame(
data=[{
'x': 1,
'y': 10,
}, {
'x': 2,
'y': 'Smoke detecto',
}, {
'x': 3,
'y': np.nan,
}, {
'x': 4,
'y': 11,
}])
fill_value = 10.5
def is_valid(y):
try:
int(y)
except Exception:
return fill_value
return y
train_data['y'] = train_data['y'].apply(is_valid)
print(train_data)
fill_value
という値が不正な値に設定したい任意の値としています(今回は直接値を設定していますが、必要に応じて中央値などに調整ください)。
apply
メソッドでもし整数変換が正常にできるのであればy
の値をそのまま返却、もし変換ができない不正な値であればfill_value
を返却しています!
実行してみると以下のように補正されます!
x y
0 1 10.0
1 2 10.5
2 3 10.5
3 4 11.0