繁体   English   中英

根据 df2 中的相应列舍入 df1 中的每一列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM