2016-12-14 5 views
1

pandas DataFrameで単純な値変更操作を実行しようとしました。データフレーム値を設定しようとしているときに "DataFrameからスライスのコピーに値が設定しようとしています"という警告が表示される

import pandas as pd 
import numpy as np 

x = np.linspace(1,10,10) 
y = x * 2 
z = [-1,-2,-3,4,5,6,7,8,9,10] 

df = pd.DataFrame(columns=['x','y','z']) 
df['x'] = x 
df['y'] = y 
df['z'] = z 

for i in range(len(df['z'])): 
    if df['z'].iloc[i] < 0: 
     df['x'].iloc[i] *= -1 
     df['y'].iloc[i] *= -1 
     df['z'].iloc[i] *= -1 

それは警告ししかし:SettingWithCopyWarning: 値が、私はこの場合に使用されたかを連鎖割り当て気づいていなかったDATAFRAME からのスライスのコピーに設定されてしようとしています。

それは私に正解ですが、かなり遅くなりました。

おかげ

答えて

1

性能もループの場合はslowierなので、最高のは、それを回避し、可能な場合はベクトル化パンダの機能を使用しています。

私はあなたがmaskを使用することができると思うし、条件が-1によってTrue複数ある場合:

df = df.mask(df['z'] < 0, df.mul(-1)) 
print (df) 
     x  y z 
0 -1.0 -2.0 1 
1 -2.0 -4.0 2 
2 -3.0 -6.0 3 
3 4.0 8.0 4 
4 5.0 10.0 5 
5 6.0 12.0 6 
6 7.0 14.0 7 
7 8.0 16.0 8 
8 9.0 18.0 9 
9 10.0 20.0 10 

別の解決策は、-1によって条件と複数での選択である:

df.loc[df['z'] < 0] *= -1 
print (df) 
     x  y z 
0 -1.0 -2.0 1 
1 -2.0 -4.0 2 
2 -3.0 -6.0 3 
3 4.0 8.0 4 
4 5.0 10.0 5 
5 6.0 12.0 6 
6 7.0 14.0 7 
7 8.0 16.0 8 
8 9.0 18.0 9 
9 10.0 20.0 10 
関連する問題