2017-06-03 131 views
1

這看起來很簡單。但我已經嘗試了幾個不同的東西,並且可能讀了十幾個似乎相關的StackOverflow問題。熊貓DataFrame在給定索引值的1列中替換值

我有密碼currnecies(比特幣等)的市場數據。訂單簿是給定貨幣的所有'詢問'和'出價'的清單。我想將數據存儲在Pandas DataFrame中。 (我並沒有堅持使用DFs,只是認爲它可能提供更容易的繪圖方式)。

所以現在的設置是一個DataFrame,其中Rate(價格)是索引,它是一個浮點數。在該價格下可用的硬幣數量在名爲Amt的列中。

當我在一個給定的價格獲得一個更新的金額我想簡單的替換值。所有可能的解決方案,我發現這個選項是最直觀的對我說:

df.Amt[df.Rate == rate] = new_amt 

雖然我沒有從中得到任何錯誤,當我檢查,看看是否金額的變化,我覺得它有沒有。我認爲這是與DataFrame本身相關的複製/切片問題之一。

例子:

df.head() 
Out[77]: 
     Rate  Amt 
0 0.018021 0.319033 
1 0.018009 29.994000 
2 0.017999 28.121000 
3 0.018042 2.233781 
4 0.018055 13.433394 

df.Amt[df.Rate == 0.018021] = 20 

df.head() 
Out[79]: 
     Rate  Amt 
0 0.018021 0.319033 
1 0.018009 29.994000 
2 0.017999 28.121000 
3 0.018042 2.233781 
4 0.018055 13.433394 

我缺少什麼?我過去曾與DF合作過更改整列,但通常不是一行。

+0

你想,如果'df.Rate == 0.018021'或只是'df.Rate' – everestial007

+0

你的問題是浮平等所有的值更改爲20。例如,顯示爲「1.02」的可能真的是「1.019」。一般來說,你並不想真正做到平等。我不知道在你的情況下的解決方案,但也許更像'x> 0.017&x <0.019' – JohnE

+0

還有一個numpy函數'isclose()'可能會幫助你。 – JohnE

回答

2

糾正錯誤,並納入@強尼的評論

你用df.Amt訪問pd.Series對象,並使用[df.Rate == 0.018021]切片它。當你想要傳遞布爾數組到loc並且以這種方式分配時。

df.loc[np.isclose(df.Rate, 0.018021), 'Amt'] = 20 

     Rate  Amt 
0 0.018021 20.000000 
1 0.018009 29.994000 
2 0.017999 28.121000 
3 0.018042 2.233781 
4 0.018055 13.433394 
+0

在這種情況下,這似乎更加健壯,即'np.equal'。我提供的費率是字符串,並且轉換爲浮動值會像1E-12一樣降低誤差。除了對數學沒有意義的值之外,還保留了與實際匹配的嚴格匹配。 與1E-10的atol一起使用的'np.close'似乎可以在早期測試中使用。 謝謝 –