![](/img/trans.png)
[英]How to return the maximum decimal "precision" and "scale" from pandas dataframe column?
[英]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.ceil
或np.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.