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

Python 将序列四舍五入为N个有效数字,python,pandas,math,rounding,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)))) 但它不适用于系列或数据帧,您可以使用,pandas.

我有一个浮点数的数据框,我需要做一个函数,它将取一列并将所有值四舍五入到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))))

但它不适用于系列或数据帧,您可以使用,
pandas.series.apply
跨轴(列或行)实现函数元素:

请注意,这里不能真正使用
pandas.DataFrame.apply
,因为round函数应该是元素级的,而不是整个轴

不同之处在于,您的函数输入是
浮点
,而不是获得
数组

另一个选项是
applymap
,它在整个
pandas.DataFrame
上实现函数元素

df.applymap(lambda x: round(x, N - int(floor(log10(abs(x))))))

下面是对数据帧中的序列应用自定义函数的另一种方法。但是,当最后一位数字为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

使用熊猫系列轮换法,请参见:@jezrael不确定您的意思,但请在评论中随意添加任何需要的进一步解释。不,我不了解对方。我认为只有代码的答案不好:)加1
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