2017-06-03 204 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'似乎可以在早期测试中使用。 谢谢 –