簡體   English   中英

設置數據類型為 Decimal 的 pandas dataframe 列的小數精度

[英]Set decimal precision of a pandas dataframe column with a datatype of Decimal

我有一個 pandas dataframe 有兩列,第 1 列包含文本,第 2 列包含十進制值。

鑰匙 價值
一個 1.2089
5.6718
7.3084

我使用'.apply' function 將值列的數據類型設置為十進制(Python十進制庫)。 一旦我這樣做了,值列將從小數點后 4 位值變為小數點后 43 位。 我試圖使用 the.getcontect.prec = 4 無濟於事。

數據幀是通過讀取與上表格式相同的 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)

上面的代碼是我嘗試過的,但仍然導致 output 的值列值具有 43 個小數位,而不是從 csv 文件中讀取的每個值應具有 4 個小數位。

我打印 dataframe 時得到的結果是:

鑰匙 價值
一個 1.20890000000003046807250939309597015380859375
5.67180000000000318323145620524883270263671875
7.30838399999999969077180139720439910888671875

我只想要 4 位小數的精度,因為這些值稍后將用於做一些數學運算,我想使用我提供的確切值。

這可以通過更改浮點數的打印選項來修改,但是它將修改每個浮點數據類型的打印方式

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

請記住,這只是它的打印方式。 該值存儲在 dataframe 中,每個小數點。

另一方面,您可以通過以下方式限制小數:

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)

修復了這個問題,似乎與 Decimal 如何從浮點數轉換為十進制數有關。 將 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)
鑰匙 價值
一個 1.2089
5.6718
7.3084

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM