[英]Round each column in df1 based on corresponding column in df2
df1:
李 | 是 | 科学 | V | 铬 | 锰 |
---|---|---|---|---|---|
20.1564 | -0.0011 | -0.1921 | 0.0343 | 0.5729 | 0.1121 |
19.2871 | -0.0027 | 0.0076 | 0.066 | 0.5196 | 0.0981 |
0.8693 | 0.0016 | 0.1997 | 0.0317 | 0.0533 | 0.014 |
df2:
李 | 是 | 科学 | V | 铬 | 锰 |
---|---|---|---|---|---|
2.0 | 0.050 | 0.3 | 0.111 | 0.50 | 0.40 |
我需要将 df1 中的列四舍五入到与 df2 中相应列相同的小数位数。 问题是每个 df 包含 40 多列都需要四舍五入到特定的小数位数。
我可以像这样逐列进行
df1["Li"]=df1["Li"].round(1)
df1["Be"]=df1["Be"].round(3)
etc
有没有更简单的方法根据 df2 中的小数位数舍入 df1 中的所有列
所需 output:
李 | 是 | 科学 | V | 铬 | 锰 |
---|---|---|---|---|---|
20.2 | -0.001 | -0.2 | 0.034 | 0.57 | 0.11 |
19.3 | -0.003 | 0 | 0.066 | 0.52 | 0.1 |
0.9 | 0.002 | 0.2 | 0.032 | 0.05 | 0.01 |
您可以使用decimal
模块中的Decimal
来获取指数部分,并使用.round
和映射字典来转换所有列:
from decimal import Decimal
exponent = lambda x: abs(Decimal(str(x)).as_tuple().exponent)
rounding = df2.T.squeeze().map(exponent)
out = df1.round(rounding)
Output:
>>> out
Li Be Sc V Cr Mn
0 20.2 -0.0 -0.2 0.034 0.6 0.1
1 19.3 -0.0 0.0 0.066 0.5 0.1
2 0.9 0.0 0.2 0.032 0.1 0.0
>>> rounding
Li 1
Be 2
Sc 1
V 3
Cr 1
Mn 1
Name: 0, dtype: int64
注意:正如@mozway 建议的那样, 0.050
只有 2 位小数而不是 3 位小数,因为 python 不关心尾随零。
这可能不是将数据转换为所需形式的非常标准的方法,但它可能会解决您的目的。
for i in df2.columns:
a = str(df2[i][0])
df1[i] = df1[i].round(len(a.split('.')[1]))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.