簡體   English   中英

圓熊貓數據框/系列

[英]Round pandas data frame/series

我在pandas數據框中有一個看起來像這樣的列(雖然更長,但這是前幾行):

>df_fill['col1']

0      5987.8866699999998672865
1     52215.5966699999989941716
2       201.8966700000000003001
3         3.8199999999999998401

我想將整列四舍五入到小數點后五位。 我可以將其舍入為整數,但不能舍入到小數點后的任何位數。 列的類型為float。

> np.around(df_fill['col1'], 0)

0      5988
1     52216
2       202
3         4

> np.around(df_fill['col1'], 5)

0      5987.8866699999998672865
1     52215.5966699999989941716
2       201.8966700000000003001
3         3.8199999999999998401

> (df_fill['col1']).round()

0      5988
1     52216
2       202
3         4

>(df_fill['col1']).round(5)

0      5987.8866699999998672865
1     52215.5966699999989941716
2       201.8966700000000003001
3         3.8199999999999998401

> (df_fill['col1']).round(decimals=5)

0      5987.8866699999998672865
1     52215.5966699999989941716
2       201.8966700000000003001
3         3.8199999999999998401

> str((df_fill['col1']).round(decimals=5))
'0      5987.8866699999998672865\n1     52215.5966699999989941716\n2       201.8966700000000003001\n3         3.8199999999999998401\

我在這里想念什么?

浮點數只能表示實數的子集 它只能精確地表示十進制數,它們是兩個負冪的和(“二進制分數”)。 將浮點數舍入為5位數字后,新的浮點數可能不是具有5個小數位的實數,因為小數部分可能無法精確表示為二進制分數。 相反,舍入會返回最接近該實數的浮點數

如果您已經設定

pd.options.display.float_format = '{:.23g}'.format

那么Pandas會以其浮點數的字符串表示形式最多顯示23位數字:

import pandas as pd

pd.options.display.float_format = '{:.23g}'.format

df_fill = pd.DataFrame({'col1':[ 5987.8866699999998672865, 52215.5966699999989941716, 
                                201.8966700000000003001, 3.8199999999999998401]})

#                       col1
# 0 5987.8866699999998672865
# 1 52215.596669999998994172
# 2 201.89667000000000030013
# 3 3.8199999999999998401279

print(df_fill['col1'].round(5))
# 0   5987.8866699999998672865
# 1   52215.596669999998994172
# 2   201.89667000000000030013
# 3   3.8199999999999998401279
# Name: col1, dtype: float64

但是,如果將float_format設置為顯示 5個十進制數字:

pd.options.display.float_format = '{:.5f}'.format

然后

print(df_fill['col1'].round(5))

產量

0    5987.88667
1   52215.59667
2     201.89667
3       3.82000
Name: col1, dtype: float64

注意底層的浮動沒有改變。 僅顯示方式。

您的問題是由於表示浮點數的精度問題所致。 數字5987.88667無法完全以浮點數表示,可以表示的最接近的數字是5987.8866699999998672865。 因此,您已經擁有最接近數組中所需數字的數字,因此將其四舍五入到小數點后五位將無效。 您已經有正確的調用:

(df_fill['col1']).round(5)

如果嘗試舍入到小數點后兩位,您會看到它有效。 所以我建議您不要擔心。 如果問題在於數字在屏幕上的顯示方式,則可以將數字打印到字符串中正確的小數位數:

print "%.5f"%(df_fill['col1'])

暫無
暫無

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

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