2014-02-28 63 views
0

我基本上試圖使用帶有索引和列名稱的iloc在DataFrame中設置一個值。這裏是測試代碼:iloc用pandas設置數值float64 vs int64

import pandas as pd 

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]}) 
print type(df['a'][0])  # numpy.int64 
df.iloc[-1]['a'] = 2000 
print df     # value changed to 2000 
df['c'] = [3.5, 4.5] 
print type(df['a'][0])  # numpy.float64 -> why does this change automatically? 
print type(df['c'][0])  # numpy.float64 
df.iloc[-1]['c'] = 2000  # yields warning, no value change 
print df 
df.iloc[-1]['a'] = 4000  # yields warning, no value change 
print df 

隨着Int64,我可以做到這一點,但不能與Float64。有其他選擇嗎?或者這是一個錯誤? 謝謝

回答

2

警告告訴你,你正在做的事情是不安全的,這是因爲你的 有一個混合型框架。取而代之的是使用loc。明白爲什麼這個保險業監督壞主意和可能不起作用的文檔(它不會在這裏),http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

In [12]: df.loc[df.index[-1],'a'] = 4000 

In [13]: df 
Out[13]: 
     a b c 
0  1 3 3.5 
1 4000 4 4.5 

[2 rows x 3 columns] 
3

Jeff的答案是正確的,但不是最佳的大熊貓語法。使用.at替代.loc(同樣,.iat而不是.iloc)會快得多。如果你使用它來獲取或設置很多值,節省的時間可以真正加起來。問題在於.at和.iat僅用於獲取和設置單個值,因此您無法獲取或設置一系列值或檢索整個列或行。因爲所有你想要做的是改變一個值,我建議:

df.at[df.index[-1], 'a'] = 4000 

如果因任何原因,你只能有一個軸基於標籤的位置和其他基於整數的位置,你也可以使用df.get_loc('基於標籤的列名')獲取該列的基於整數的位置,或類似df.index.get_loc('基於標籤的行名')來獲取該行的基於整數的位置。

相關問題