私はいくつかの基本的なデータサイエンスを学んでおり、タイタニックデータセットに取り組んでいます。「Age」列にnull値があり、「Pclass」や「Sex」などの別の列の平均を入力したいと思います。
「Pclass」は乗客クラスを指し、乗客が1等、2等、または3等のチケットを持っているかどうかに基づいて3つの値(1、2、3)があります。
'Age'と集計に使用する列の2つの列名を受け取る関数を記述して、このプロセスを一般化しようとしています。これを完全に一般化する方法が思いつかないので、今のところ、Pclassに基づいて集計するとします。
私は次のようにPclassに基づいて平均年齢を取得しました:
# Figure out the mean age for each class
mean_age = round(df_train.groupby('Pclass').mean()['Age'])
mean_age
次のように関数を定義しようとしました(38、30、25)はmean_ageからのものです:
def fill_age(data, col1, col2):
if data[col1].isnull():
if data[col2] == 1:
return 38
elif data[col2] == 2:
return 30
else:
return 25
else:
return data[col1]
そして.apply()を使おうとしました:
df_train['Age'] = df_train.apply(fill_age(df_train,'Age','Pclass'), axis = 1)
私はここで何が間違っているのですか、そしてそれを修正してさらに一般化するためにこれをどのように考えますか?
編集:次の行は機能しているようですが、データフレーム自体に変更を適用するために必要であり、.apply()で「inplace」を使用することはできません
df_train.groupby('Pclass')['Age'].apply(lambda x: x.fillna(round(x.mean())))
内部apply
で関数を呼び出すのではなく、関数と引数をargs=()
またはキーワード引数を介して渡します。
df['Age'] = df.apply(fill_age, col1='Age', col2='Pclass', axis=1)
しかし、ベクトル化を介してこれを行うためのより良い方法があります:
df['Age'] = df['Age'].fillna(df.groupby('Pclass')['Age'].transform('mean'))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加