设置数据类型为小数的 pandas 数据框列的小数精度

Set decimal precision of a pandas dataframe column with a datatype of Decimal

我有一个包含两列的 pandas 数据框,第 1 列包含文本,第 2 列包含小数值。

Key Value
A 1.2089
B 5.6718
B 7.3084

我使用'.apply'函数将值列的数据类型设置为十进制(Python十进制库)。执行此操作后,值列从小数点后 4 位变为小数点后 43 位。我试图使用 .getcontect.prec = 4 无济于事。

数据框是通过读取与上述 table 格式相同的 CSV 文件构建的。数值栏所有小数只保留4位小数。

import pandas as pd
from decimal import *

def get_df(table_filepath):
    df = pd.read_csv(table_filepath)
    getcontect.prec = 4
    df['Value'] = df['Value'].apply(Decimal)

上面的代码是我已经尝试过的,但仍然导致输出值列值具有 43 个小数位,而不是从 csv 文件读取的每个值应具有的 4 个小数位。

打印数据帧时得到的结果是:

Key Value
A 1.20890000000003046807250939309597015380859375
B 5.67180000000000318323145620524883270263671875
B 7.30838399999999969077180139720439910888671875

我只想要 4 位小数的精度,因为这些值稍后将用于做一些数学运算,我想使用我提供的精确值。

这可以通过更改浮点数的打印选项来修改,但是它会修改每个浮点数据类型的打印方式

pd.set_option('display.float_format', '{:.10f}'.format)

请记住,这只是它的印刷方式。该值存储在数据框中,每个小数点。

另一方面,您可以通过以下方式限制小数:

df.Value = df.Value.round(4)

但这将根据小数点后五位四舍五入。最后一个选项是使用 np.ceilnp.floor 但由于这不支持小数,因此需要使用乘法和除法的方法:

precision = 4
df['Value_ceil'] = np.ceil(df.Value * 10**precision) / (10**precision)
df['Value_floor'] = np.floor(df.Value * 10**precision) / (10**precision)

修复了问题,似乎与小数如何从浮点数转换为小数有关。将 Values 列设置为数据类型字符串然后转换为 Decimal 得到了我想要的结果。

def get_df(table_filepath):
    df = pd.read_csv(table_filepath)
    df['Value'] = df['Value'].apply(str) 
    df['Value'] = df['Value'].apply(Decimal)
Key Value
A 1.2089
B 5.6718
B 7.3084