2017-07-06 12 views
1

対応する一部のグループの中央値に基づいて年齢の値を置き換えようとしています。 groupbyを使ってgrouped_medianというテーブルを作った。これは私のコードです:Apply関数がデータフレーム内の値を置き換えません

def fillAges(row, grouped_median): 
    return grouped_median.loc[row['Sex'], row['Class'], row['Title']]['Age'] 


df['Age'] = df.apply(lambda x : fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age'], axis=1) 

df 

私はこの部分のみを印刷する場合:

print(df.apply(lambda x : fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age'], axis=1)) 

値が正しいですが、私は、DFを見たら、その後、NaN値が交換されていません。私はどんな助けにも感謝します。ありがとうございました!

編集:Nathanielが言ったように、このコードは正常に動作します。実際、dfは列車とテストの両方のデータセットから連結された大きなデータフレームであり、列車または試験のフラグ列が1つ追加されています。それで、これは私がやっていることです:

df[df['flag']=='train']['Age'] = df[df['flag']=='train'].apply(lambda x : fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age'], axis=1) 

それは動作しません。これは私にこの警告を与えるだろうが、私はそれが実際に何もしていないという意味ではない警告だと思った! "値はDataFrameからスライスのコピーに設定しようとしています。代わりに.loc [row_indexer、col_indexer] = valueを使用してみてくださいドキュメントの警告を参照してください:pandas.pydata.org/pandas-docs/stable/...

私が行うために必要なものをすべて

は左から[DF [「フラグ」] ==「電車」]一部を除去する。

私はまだこのアプローチは働いていなかった理由はわからないでした。誰もが洞察力を持っているなら、それを知っていただければ幸いです。ありがとうございます。

+0

imputationのために 'fillna()'を使うことについてのこの記事をチェックしてください(つまり、欠けているデータに中央値を書き込む):https://stackoverflow.com/questions/32617811/imputation-of-missing-values-for-categories-in -pandas – NickBraunagel

+0

ありがとうございました!しかし、これは私のためには機能しません。特定のグループの中央値を使用したい。私はテーブルを作りました。私はapply関数を使います。メディアンは実際には私の問題ではありません。私の問題は、データフレーム内でデータが置き換えられない理由です。 – user3709260

答えて

2

シリーズの要素だけではなく、シリーズを返してシリーズを返すように関数を書式設定する必要があります。あなたのためにこれを行うべきであるseries_opの機能

def fillAges(row, grouped_median): 
    return grouped_median.loc[row['Sex'], row['Class'], row['Title']]['Age'] 

def series_op(x): 
    x['Age'] = fillAges(x, grouped_median) if np.isnan(x['Age']) else x['Age'] 
    return x 


corrected_df = df.apply(series_op, axis=1) 

データがありません。grouped_median私はあなたの問題を再現できません。私が調理したテストデータでは、これを正しく動作させることができますが、正しく動作させることもできます。

+1

該当しません。 'apply()'は確かに値を返します。 – JohanL

+1

@JohanL、yup。あなたが正しい。 –

+0

ありがとう、ナサニエル!よく働く。申し訳ありませんが、なぜ私のアプローチが間違っているのか分かりません。私のコードは必要なシリーズの要素を取り、それらの要素を返すだろうし、それらを私のdfに割り当てることを期待するだろう。私は学ぶことを試みている。なぜそれは働いていませんでしたか? #apply関数にシリーズの一部を渡すべきではないですか? – user3709260

関連する問題