2017-12-22 8 views
0

私がやりたかったのは、pandas DataFrameの1つのエントリNaN値を1つの文字列に置き換えることでした。ここに私がしたことがあります。DataFrame警告の1つのエントリを置き換えますか?

s = pd.DataFrame({'A':['S12','S1','E53',np.NaN], 'B':[1,2,3,4]}) 

s['A'][s['A'].isnull()==True] = 'P' 

このコードは、データフレームに「NaNの」の値を見つけると「P」の文字列にそれを交換しようとすると、結果は次のようになります。

 A B 
0 S12 1 
1 S1 2 
2 E53 3 
3 P 4 

しかし、私はまた、このような警告が出ます:

/Users/grr/anaconda/bin/ipython:3: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    # -*- coding: utf-8 -*- 

誰もこれが何を意味するのかと、私はこれを避けるために何をすべきか私に説明できますか?

ありがとうございました!

+0

可能な複製(https://stackoverflow.com/questions/20625582/how-to-deal-with-settingwithcopywarning-in-パンダ) – Ding

+0

ここで改善できることがたくさんあります。しかし、まずは.fillna()関数があります。 –

答えて

0

推奨されない方法で値を割り当てようとしているという警告が表示されます。詳細はhttps://stackoverflow.com/a/20627316/7386332を参照してください。

代わりに、あなたはこれを行う必要があります。

import pandas as pd 
import numpy as np 

s = pd.DataFrame({'A':['S12','S1','E53',np.NaN], 'B':[1,2,3,4]}) 

s.A.fillna('P', inplace=True) # alternative: s.A.replace(np.NaN, 'P', inplace=True) 

は、あなたがlocを使うべき正しい方法で値をアクセスします。

s.loc[:,'A'] = s.loc[:,'A'].replace(np.NaN,'P') 
+0

本当にここでlocを使うのは意味がありません – DJK

+0

@ djk47463ええ、この場合は意味がありません。それで、私は、置換または塗りつぶしを使用することを提案しています。しかし、locは、dfsの値にアクセスして値を変更する正しい方法です。 –

0

値を設定するときは、locを使用してください。

実質的に、__setitem__呼び出しが元のデータフレームまたはメモリ内のコピーで実行されるという保証はありません。エラーメソッド(indexing-view-versus-copy)に記載されているセクションを実際に読んでください。好ましい方法は、次のようになります[?パンダにSettingWithCopyWarningに対処する方法]の

s.loc[s.A.isnull(), 'A'] = 'P' 
関連する問題