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