【Kaggleの勉強(4/17)】Tabular_Playground‐2021April 欠損値とかの補正
2021AprilのDiscussionを参考に見てみたら欠損値を鮮やかに(初心者の私から見ると、ほんとに鮮やか)処理している方がいたので今後のために書き残します。
ただ、プログラムの意味が難しくて解読が必要でした。
■平均値で穴埋め
これは本にも書いてあったので理解できました
all_df['Age'] = all_df['Age'].fillna(all_df['Age'].mean())
■欠損値はXで穴埋め、他の値は先頭の文字だけにする
all_df['Cabin'] = all_df['Cabin'].fillna('X').map(lambda x: x[0].strip())
ここからよくわからない。
mapとlambdaが何しているのか。
ここのリンクで勉強。ふむふむ。
techacademy.jp
まず、lambdaは無名関数といって、簡単な処理の関数であればdefで書く代わりに
使えるもの、ということらしい。使い方は、
lambda 引数: 返り値
とするか、
関数名 = lambda 引数: 返り値
として、関数名に置き換えてdefと同じように使うこともできる。
例えば、
def square(n): return n ** 2
はこの式を書けば同じように使える。
square = lambda n: n**2
次にmapの使い方。
map(関数, シーケンス)
なので、関数にlambdaを入れるとこんな感じになる。
map(lambda 引数: 処理, シーケンス)
でもさっきの式にはシーケンスが指定されていないな。。。
そもそも x[0].strip() ってなんだ??
strip()をググると、
stripメソッドの引数に何も指定しない場合、自動で空白文字を削除します。
とあるので、xの1つ目の値から空白文字を削除することになる。
空白文字ってなんだ??
これは、
空白文字は以下の通りです。
半角スペース
全角スペース
「\n」改行
「\f」改ページ
「\t」タブ
「\v」垂直タブ
「\r」復帰
ということらしい。
( ,,`・ω・´)ンンン? strip()ってなんか意味あんのかな?
わからんけど、入れなくてもおんなじ結果になった。
ええっと、シーケンスが特定されいないけど、、、
あ、Pandasでのmapの動きを見ればいいのかな。
これで見ると、、、
Seriesの各要素に適用されるようだ。別にシーケンスは指定しないでいいんだね。
なので、このコードの意味は、
all_df['Cabin'] = all_df['Cabin'].fillna('X').map(lambda x: x[0].strip())
Cabinの値のNullをXに置き換えて、それぞれの値の1文字目の空白を削除したもので
置き換えるという意味かな。
次は、
all_df['Ticket'] = all_df['Ticket'].fillna('X').map(lambda x:str(x).split()[0] if len(str(x).split()) > 1 else 'X')
これが一番良くわからなかった。
NullをXで置き換えるまでは一緒。で、次にもしそれぞれの値(文字列)のstr(x).split()が1より大きかったら
str(x)をsplitした文字列の1番目の値に置き換える。1以下だったらXに置き換えるってことね。
str(x).split()がわからんのぅ。。。
この記事でわかるかな。
note.nkmk.me
str(x).split() = 区切り文字で分割
みたいだ。区切り文字を何も指定していないので、この場合はスペースで区切られるみたいだ。
lenはリストの要素数を数えるので、スペースの区切りが無いものは1、区切りがあると1より大きな
数字が返ってくる。
Ticketはアルファベット+スペース+数字もしくは数字で表されているように見えるので、意味が
ありそうな先頭のアルファベットだけ残して、数字だけのものはXに変えちゃってるのね。
よくわかりました。これでデータの整理を終えて、今度はブレンドをやってみよう。