2017-02-24 12 views
1

に.LOCと値:上書きナンは、私は次のコード行に必要なタスクを解決しようとしたパンダ

df['Age'][np.isnan(df["Age"])] = rand1

enter image description here

しかし、これは「SettingWithCopyWarning」を提起し、私は見つけると思います.loc機能を使用してデータフレームのNan値(列 'Age')を設定する方が良い方法です。

私はすでにdocumentationを見ましたが、この問題をどのように修正できるかはまだ分かりません。 .locで解決策を見つけることができませんでした。

私は何かヒントやアドバイスをいただければ幸いです。あなたがfillnaを必要とするため、いくつかの値にNaNを交換

答えて

1

loc

df.Age = df.Age.fillna(rand1) 

あなたのソリューション:

df.loc[np.isnan(df["Age"]), 'Age'] = rand1 
#same as 
#df.loc[df["Age"].isnull(), 'Age'] = rand1 

またindexing view versus copyを確認することができます。

サンプル:

df = pd.DataFrame({'Age':[20,23,np.nan]}) 
print (df) 
    Age 
0 20.0 
1 23.0 
2 NaN 

rand1 = 30 
df.Age = df.Age.fillna(rand1) 
print (df) 
    Age 
0 20.0 
1 23.0 
2 30.0 

#if need cast to int 
df.Age = df.Age.fillna(rand1).astype(int) 
print (df) 
    Age 
0 20 
1 23 
2 30 
+0

おかげであなたの助けのためにたくさん。コードは正常に動作します。 .loc関数の内部で何が起こっているのかを教えてください。私は当初、年齢などのインデックスにアクセスするためだと思っていました。なぜ私たちは.isnanの部分を渡して、もう一度Ageの列を渡していますか?ドキュメントを読んだ後でさえ、これを理解するのは本当に苦労します。 – ErnieandBert

+0

これは、 'np.isnan(df ['Age'])'がブール値のマスクを返し、 'loc'との組み合わせで値が' True 'の 'rand1'に設定されているので機能します。私はより良い説明がこの[パンダチュートリアル](http://tomaugspurger.github.io/modern-1.html)にあると思う - タイトルSettingWithCopy'をチェックする(別のマスク 'f ['a'] <= 3'を使う – jezrael

+0

そして、このチュートリアルはこちら[http://pandas.pydata.org/pandas-docs/stable/tutorials.html] - 'モダンパンダ'(非常に良い説明) – jezrael

関連する問題