pandas で各要素の有効数字を揃える(「小数点以下何桁」ではなく)
Introduction
df.round(n) だと「小数点以下n桁」で四捨五入される丸められるだけで、有効数字を揃えたい場合はちょっと違う、ということがあった。
たとえば df という DataFrame の中身として
- 12.345
- 9.8760
があったとき、df.round(2) すると、
- 12.34
- 9.88
になる*1。
ところが今やりたいのが「有効数字3桁であらわしたい」であって、単に「小数点以下2桁で丸めたい」ではない、とするとどうか。つまり、
- 12.3
- 9.88
となってほしい場合。
Methods
まず
import numpy as np from math import log10, floor def round_sig(x, sig=2): return np.around(x, sig-int(floor(log10(abs(x))))-1)
という関数を作る。これはstackoverflowの回答の indgar 氏のコードをコピペし、x を abs(x) にしたもの。また、python デフォルトの round よりも numpy の around の方が良いようなので、そちらにした。
使うときは、まだこの辺がよくわかってないのだが、Series にしか直接は適用できないっぽい?ので、
df_orig = pd.Series([12.345, 9.8760]) # 適当な元データを用意する sig_digit = 3 # 有効桁数を指定する s_orig = df_orig[:] # DataFrame --> Series s_round = s_orig.apply(round_sig, args=(sig_digit,)) # ここで apply df_round = s_round.to_frame() # Series --> DataFrame df_round # 結果の表示
みたいな感じで。あ、Series への変換と逆変換のところも関数に入れればいいのか…