🎃

#2 concatとは、inplace=TrueがFalseだとどうなる?、【今年中にKaggleでメダルを取る男】

2024/03/06に公開

「PythonではじめるKaggleスタートブック」で出てきたコードでわからなかったところを思考整理がてらここに記述していきます。

concat

以下のconcatがよくわからない。

data = pd.concat([train, test], sort=False)

→trainとtestのdfを連結する

こちらの記事が参考になりそうです:https://qiita.com/greenteabiscuit/items/1c950d94d8f9156ace10

fillna

以下のコードのinplace=TrueがFalseになっているとどうなるのか、気になったので調べてみました。

data['Embarked'].fillna(('S'), inplace=True)#欠損値をSで補完
data['Embarked'] = data['Embarked'].map({'S': 0, 'C': 1, 'Q': 2}).astype(int)#S,C,Qといったカテゴリー型を整数型にする

ChatGPTに聞いてみました。すると、以下のコードがきました。

import pandas as pd

# データの作成
data = pd.DataFrame({'Embarked': ['S', 'C', None, 'Q', 'S', 'C', 'S']})#Noneが欠損値

# inplace=Falseの場合
modified_data = data['Embarked'].fillna('S', inplace=False)#NoneをSに置き換える
modified_data = modified_data.map({'S': 0, 'C': 1, 'Q': 2}).astype(int)#S,C,Qを0,1,2に置換

print("変更後のデータ:")
print(modified_data)
print("\n元のデータ:")
print(data)

出力

変更後のデータ:
0    0
1    1
2    0
3    2
4    0
5    1
6    0
Name: Embarked, dtype: int64

元のデータ:
  Embarked
0        S
1        C
2     None
3        Q
4        S
5        C
6        S

解説

ここではfillna()とmap()は新しいDF(modified_data)を作成していますが、元のDF(data)の内容は変更されません。そのため、出力で「元のデータ」は、ソースコードに書かれている内容と同じです。

では、「inplace=True」にするとどうなるか。

出力

AttributeError: 'NoneType' object has no attribute 'map'

このようなエラーが出ます。

解説

AttributeErrorは「属性エラー」っていうらしいです。
これは「'NoneType'オブジェクトには'map'という属性はない」ということだそうです。
「inplace=True」にすると、fillna()は元のDF(data)を変更し、新しいDF(modified_data)を返しません。そのため、modified_dataにはなにも格納されません。
たぶん予想としては、何も格納されていないDFにmap関数を使っても、そりゃあ処理するものがないからエラーになるよね〜みたいなことだと認識しています。

「PythonではじめるKaggleスタートブック」勉強してみての感想

意外とボリューミー。色々とわからない関数があるのでそれらの解釈に時間がかかりますね。一つずつ丁寧に解釈していくのか、それともある程度ざっとやってみるかってので悩みどころですが、前者の方が楽しいのでそっちでやってみます〜。

Discussion