2017-04-06 16 views
2

条件に基づいてデータフレームの列の値を変更しようとしています。私はこれを使用しているパンダ.locを使用しているときに警告が表示される

In [1]:df.head() 
Out[2]:    gen  cont 
timestamp                 
2012-07-01 00:00:00  0.293  0  
2012-07-01 00:30:00  0.315  0  
2012-07-01 01:00:00  NaN   0  
2012-07-01 01:30:00  NaN   0  
2012-07-01 02:00:00  0.231  0 

In [1]:df.head() 
Out[2]:    gen  cont 
timestamp                 
2012-07-01 00:00:00  0.293  0  
2012-07-01 00:30:00  0.315  0  
2012-07-01 01:00:00  0.0   0  
2012-07-01 01:30:00  0.005  0  
2012-07-01 02:00:00  0.231  0  

私は、2列の合計が0.01の閾値以下であるときはいつでもNaN'gen'列を設定したいので、私が欲しいのはこれです

df.loc[df.gen + df.con <0.01 ,'gen'] = np.nan 

それは私が望む結果を与えるが、警告付き:

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 

私は.locを使用しているので混乱しています。私はそれを推奨する方法で使用していると思います。

+2

属性として列にアクセスするためにドットを使用する以外に、このコードでは、警告を生成するためにこれより前に何かをしておく必要があります。これらの行の前にdfをフィルタリングしましたか? – EdChum

+0

以前にdfをフィルタリングしましたが、この行によって警告が生成されています。コンソールで行を実行すると、警告が再現されます – doctorer

+0

@doctorer - フィルタリングのコードを追加できますか?おそらく 'df1 = df.copy()'が必要でしょう – jezrael

答えて

2

あなたのソリューションはうまく動作します。 mask

代替ソリューション条件True場合、それはデフォルトでNaNを追加:あなたはcopyが必要

df['gen'] = df['gen'].mask(df['gen'] + df['cont'] < 0.01) 
print (df) 
      timestamp gen cont 
0 2012-07-01 00:00:00 0.293  0 
1 2012-07-01 00:30:00 0.315  0 
2 2012-07-01 01:00:00 NaN  0 
3 2012-07-01 01:30:00 NaN  0 
4 2012-07-01 02:00:00 0.231  0 

EDIT。

dfの値を後で変更すると、元のデータ(df_in)に変更が反映されず、警告メッセージが表示されます。

+0

これはOPが望むものではなく、彼らは警告を取り除きたい、彼らはすでに望ましい結果を得ています – EdChum

+0

@EdChum - 申し訳ありませんが、私はそれが 'EDIT'の解決策だと思います。または何かが不足している? – jezrael

+0

私はdf_inを変更しないままにしたいので、新しいdfにコピーしました。 – doctorer

関連する問題