我有一个浮点数的数据框,我需要创建一个函数,该函数将带有一列并将所有值四舍五入为N个有效数字
因此该列可能类似于:
123.949
23.87
1.9865
0.0129500
如果我想舍入到3个有效数字,则将列和3传递给函数以获取
124.0
23.9
1.99
0.013
如何有效地做到这一点而又无需遍历专栏?
我有一个方程式,可以计算数字的有效数字
round(x, N-int(floor(log10(abs(x))))
但不适用于序列或数据框
答案 0 :(得分:1)
您可以使用pandas.Series.apply
来实现沿轴(列或行)的明智的功能元素:
df.col.apply(lambda x: round(x, N - int(floor(log10(abs(x))))))
请注意,此处不能真正使用pandas.DataFrame.apply
,因为round函数应该是元素明智的,而不是在整个轴上。
区别在于您的函数输入是float
而不是array
。
另一个选择是applymap
,它将在整个pandas.DataFrame
上逐个元素地实现功能。
df.applymap(lambda x: round(x, N - int(floor(log10(abs(x))))))
答案 1 :(得分:0)
这是在数据框中的系列上应用自定义函数的另一种方法。但是,当最后一位数字为5时,内置的round()似乎会将小数部分四舍五入,因此在您的示例中,您实际上将获得0.0129而不是0.013。我试图对此进行补救。还添加了将有效数字的数量设置为参数的功能,以获取要应用的舍入器。
import pandas as pd
from math import floor, log10
df = pd.DataFrame({'floats':[123.949, 23.87, 1.9865, 0.0129500]})
def smarter_round(sig):
def rounder(x):
offset = sig - floor(log10(abs(x)))
initial_result = round(x, offset)
if str(initial_result)[-1] == '5' and initial_result == x:
return round(x, offset - 2)
else:
return round(x, offset - 1)
return rounder
print(df['floats'].apply(smarter_round(3)))
Out:
0 124.000
1 23.900
2 1.990
3 0.013
Name: floats, dtype: float64