2013-05-14 106 views
4

可能是一個微不足道的問題,但我需要了解這裏發生了什麼(以及如何解決它)。熊貓:將值重新分配給數據幀的「塊」

假設我有列「A」和「b」一個數據幀,如下所示:

f = pandas.DataFrame({'a':[1,2,3,4,5], 'b':[10,20,30,40,50]}) 

現在爲「A」是3或更小的每一個元素,我想要分割的相應的元件的'b'除以10。

f[f['a']<=3]['b'] = (f[f['a']<=3]['b'])/10 

因此,'b'列中的值現在應該是[1,2,3,40,50]。

但我發現'b'列保持不變!是什麼賦予了?

+0

http://stackoverflow.com/questions/14192741/understanding-pandas-dataframe-indexing – MichaelJCox

回答

6

我認爲您正在嘗試將值分配給副本而不是視圖(f[f['a']<=3]['b']是副本),請參閱Returning a view versus a copy

但是,您可以重新排列這一點,它會工作是一個觀點:

In [11]: f['b'][f['a']<=3] = (f[f['a']<=3]['b'])/10 

In [12]: f 
Out[12]: 
    a b 
0 1 1 
1 2 2 
2 3 3 
3 4 40 
4 5 50 
+1

爲了詳細說明安迪的回答,請閱讀http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-view-versus-copy瞭解發生了什麼。 –

+0

@DanAllan只是用相同的鏈接填充:) –

+0

@AndyHayden,希望在'返回視圖與副本'部分有更多的示例,因爲似乎有很多問題(和混淆)問候... – Jeff

0

像剛纔提到的答案,它是複製和視圖的問題。

如果我想這樣做,我可能會選擇這樣的:

f['b'] = np.where(f['a'] <= 3, f['b']/10, f['b']) 
#f 

Out[26]: 
a b 
0 1 1 
1 2 2 
2 3 3 
3 4 40 
4 5 50