2016-12-14 17 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: 值正試圖從一個數據幀 我不知道如何鏈式分配在這種情況下被用於對切片的副本設置。

它給了我正確的答案,但顯着更慢。

感謝

回答

1

服務表現,如果環路是slowier,所以最好是避免它,如果可能,請使用量化的大熊貓功能。

我認爲你可以使用mask,如果條件是True多由-1

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 
相關問題