2017-06-03 9 views
1

これは単純なもののようです。しかし、私はいくつかの異なることを試して、多分関連しているようなStackOverflow質問を読んだ。Pandas DataFrameは、インデックス値を指定して1列の値を置き換えます。

暗号化処理の市場データ(BitCoinなど)があります。注文書は、特定の通貨のすべての「尋ねる」および「入札」のリストです。私はPandas DataFrameにデータを保存したいと思っています。 (私はDFの使用についていないので、道路を簡単にプロットできると思っていただけです)

これで、DataFrameはレート(価格)がインデックスでフロートです。その価格で利用できるコインの数量は、Amtという列にあります。

私が与えられたレートで金額を更新すると、その値を置き換えるだけです。

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

私はAMTの変更は、私はそれがない持っていることを見つけるかどうかをチェックしたときに、私は、ここからすべてのエラーを得ることはありませんが:私はこのオプションは私にとって最も直感的であることが判明し、すべての可能な解決策の。私は、これがコピー/スライスの問題とDataFrame自体の作業の1つであると想定しています。

例:

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を使って列全体を変更しましたが、一般的には1行しか変更しませんでした。

+0

は 'df.Rateの== 0.018021'または単に' df.Rate' – everestial007

+0

あなたの問題は、平等をフロートである場合は20にすべての値を変更しようとしています。 「1.02」と表示されるものは実際には例えば「1.019」であるかもしれません。一般的に言えば、フロートの平等を本当にしたいとは思わない。あなたのケースでは解決策はわかりませんが、おそらく 'x> 0.017&x <0.019' – JohnE

+0

のようなものですが、あなたに役立つ関数numclpy isclose()があります。 – JohnE

答えて

2

誤差を補正し、ヨーネさんのコメント

あなたはdf.Amtpd.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のようなエラーを追加しています。数学に無意味な値に加えて、実際に一致するものと厳密な一致を保ちます。 atolが1E-10で使用されている 'np.close'は、初期のテストで動作するようです。 ありがとう –

関連する問題