2017-09-11 65 views

回答

2

你做要使用第二種方法。它返回一個數據框子切片併爲每一行分配相同的值。

例如,

df 

    a b 
0 1 4 
1 2 3 
2 3 6 

df[df['a'] == 3] 

    a b 
2 3 6 

df[df['a']==3] = 3 

df 

    a b 
0 1 4 
1 2 3 
2 3 3 

第一種方法不起作用,因爲布爾索引返回列(系列),其試圖將分配給副本,所以分配失敗:

df[df['a'] == 3].a = 4 
/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/pandas/core/generic.py:3110: 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 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    self[name] = value 

所以,你的選擇是使用.loc(按名稱訪問)或iloc(通過索引訪問)基於索引:

df.loc[df.a == 3, 'a'] = 4 

df 
    a 
0 1 
1 2 
2 4 

如果您正在傳遞布爾掩碼,則不能使用iloc

+1

'df.a = np.where(df.a == 3,4,df.a)'也許他對'numpy' :-)也很好 – Wen

1

使用loc

In [1289]: df.loc[df['a']==3, 'a'] = 4 

In [1290]: df 
Out[1290]: 
    a 
0 1 
1 2 
2 4 
2

使用.loc布爾索引和列標籤的選擇:

df.loc[df.a == 3,'a'] = 4 
print(df) 

輸出:

a 
0 1 
1 2 
2 4 

在你的方法正在發生的事情是,你是切片你的數據框和熊貓正在創建一個副本和那個屁股調整發生在數據幀的副本上,而不是原始數據幀本身。

0

你會想這樣做

df['a'].apply(lambda x: 4 if x ==3 else x) 

這將使:

0 1 
1 2 
2 4 
+0

應用被認爲是骯髒的拒絕熊貓API家庭。 –

1

或者你也可以做這樣的

df['a'] = df['a'].replace(3, 4) 

(修改,感謝@COLDSPEED)

相關問題