【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の動きを見ればいいのかな。

note.nkmk.me

これで見ると、、、
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に変えちゃってるのね。

よくわかりました。これでデータの整理を終えて、今度はブレンドをやってみよう。