2017-10-25 6 views
0

を取得しているので、指定された条件がTrueであるかどうかを示す新しい列を作成しようとしています。私は列に単に "1"か "0"を書いて欲しいです。右、私はそれが= 1とFalse = 0デフォルトでは、私は整数に変換し、真の場合を考えていますpython:なぜ私はsetwithcopywarning

data_sub = data_orig.loc[~pd.isnull(data_orig['Last_Audit_Date']), :] 
data_sub.reset_index(inplace=True) 
data_sub['PackageLengthFlag'] = (abs(data_sub.loc['AUDIT_Primary_Length'] - data_sub.loc[:, 'PKG_SUB_Length']) > threshold) 

は、ここに私のコードですか? (私はどこかにこれを言っ読み取り思った...)

そして、ここでは私が得続ける警告だ:

How to deal with SettingWithCopyWarning in Pandas?

Correct way to set value on a slice in pandas

Pandas SettingWithCopyWarning:私はに読み込ま

SettingWithCopyWarning: A value is trying to be set on a copy of 
a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead 

しかし、私は彼らが私が探していることをするとは思わない。 誰でもアドバイスしていますか?私はこの質問が痛いほど馬鹿に聞こえるかもしれないことは知っていますが、依然として助けに感謝します!

私はdata_subを作成した2行のコードを追加しました。希望が助けてくれる!

+0

このエラーの原因はここにはありませんが、これに先立つコードの中にある可能性があります。このエラーを生成する '.copy'を呼び出さずにデータフレームのサブスライスを抽出しようとしました。 –

+0

'data_sub'はスライスのコピーです –

+0

サンプルdfなしで推測するのは難しいですが、これはうまくいくはずです。 data_sub ['PackageLengthFlag'] =(np。.astype(int) – Vaishali

答えて

1

完全なコピーを行わずに一部のデータフレームのサブスライスを抽出しようとすると、上記のコードにエラーが表示されるため、参照は実際には別の大きなデータフレームの一部の参照になります。

data_sub = data_sub.copy() 
data_sub['PackageLengthFlag'] = ((data_sub['AUDIT_Primary_Length'] \ 
        - data_sub['PKG_SUB_Length']).abs() > threshold).astype(int) 

コールdf.abs全体の結果にabs機能を実行するために:あなたが何をしようとして上の多くのコンテキストなし

は、単に事前にコピーを作ります。 absは、pd.Seriesオブジェクトを処理できないバニラのpythonメソッドです。

最後の1つは、astypeコールを結果を整数値に変換します。あなたが生成されたエラーを参照してください

df 

    A_Key B_ID C_Key D_NA 
0 123 22 343 23 
1 121 23 45.4 52 

x = df.iloc[[0], :] 
x 

    A_Key B_ID C_Key D_NA 
0 123 22 343 23 

x.iloc[:, 0] += 2 
/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/pandas/core/indexing.py:517: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 


はここで何をやっているの例です。しかし、ほとんどの場合、オリジナルはオリジナルに影響を与えずに変更する必要があります。今すぐ最初にコピーしてください:

x = x.copy() 
x.iloc[:, 0] += 2 # no warning 

エラーが表示されています。興味深いことに、垂直サブスライスで同様の操作を実行しても同じ動作は見られません。私はパンダが完全に独立したコピーを返すことによってこれをスマートに処理すると信じています。

+0

私はdata_subを作成した2行のコードを追加しました。私はインデックスをリセットしたので、もう問題はないと思った? – alwaysaskingquestions

+0

@alwaysaskingquestions locスライスの操作は、元のものに反映されていると考えられます。そしてあなたは警告を受け取ります。私の答えは成り立つ。 –

+0

あなたはデータをスライスした後、別のコピーを作成する必要があると言っていますか? – alwaysaskingquestions