将系列四舍五入为N个有效数字

时间:2019-08-21 10:54:37

标签: python pandas math rounding

我有一个浮点数的数据框,我需要创建一个函数,该函数将带有一列并将所有值四舍五入为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))))

但不适用于序列或数据框

2 个答案:

答案 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