如何操作熊猫数据框中的小数



我有一个这样的数据框(df):

euro    token
200.0   65.78947368421053
9997.8  2631.0

每当只有 .0 时,我想摆脱 .0,但是当"欧元"中有像 .8 这样的小数时,我希望必须像您通常使用货币一样使用小数。 因此,"欧元"列的定义将是小数点后 2 位,除非只有 0。对于"token"列,它将是 18 位小数,当只有 0 时不显示尾随的 0 和没有小数。

我现在读了很多书,但甚至找不到从哪里开始。任何人?

关于更多问题的更新示例

import pandas as pd
import numpy as np
min_invest = 200
cps_exchange_rate_eur = Decimal(38) / Decimal(10)
df = pd.read_excel(file.xlsx,
index_col=None,
dtype={'euro': float},
na_values='NA'
)
print(df.head())
print(df.dtypes)
email              euro
0     first@gmail.com    600.00
1     second@web.de      200.00
2     third@web.de       1997.80
3     fourth@gmail.com   200.00
4     fifth@gmx.ch       9997.80
email     object
euro     float64
dtype: object

现在我正在尝试修复 2 个小数点。

df.loc[:, 'euro'] = np.round(df['euro'], decimals=2)
df.loc[:, 'euro_cent'] = (df['euro'] * 100).astype(int)
print(df.head()
print(df.dtypes)
email    euro  euro_cent
0              first@gmail.com  600.00      60000
1                second@web.de  200.00      20000
2                 third@web.de  1997.80     199779
3             fourth@gmail.com  200.00      20000
4                 fifth@gmx.ch  9997.80     999779
email         object
euro         float64
euro_cent      int64
dtype: object

如您所见,它在第 2 行和第 4 行中搞砸了。我不知道如何解决这个问题。

谢谢曼努埃尔

如果您需要存储的值精确到小数点后两位,那么您应该使用decimal包进行算术。 如果要保持完全精度,但在输出时仅打印小数点后两位,请参阅有关 Python 格式的各种教程,例如"{:.2f}".format(euro)

对OP评论的回应

但是看看你是如何得到汇率的:你分配了一个float值,所以它不再保证在10的基数中正是3.8;相反,它是二进制中最接近的近似值。 我得到3.79999999999999982236431605997495353221893310546875.

如果您希望从打印页面上看到的内容中获得确切的结果,则不能在计算中使用小数、非二进制数。 要获得精确的 3.8,请使用Decimal(38) / Decimal(10)

对下一条评论的回应

这是相同的问题:您使用的是读取类型float的输入包,该输入包与文件中的数字字符串的表示形式不同。 分数.8不能用二进制精确表示。 第 2 行和第 4 行搞砸了,因为您使用了float值而不是Decimal。 四舍五入到 2 位并不意味着计算机现在可以表示精确的百分之一;它只是意味着您获得最接近的可用值。 例如:

>>> np.round(0.8, 2)
0.80000000000000004

处理此问题的一种方法是在Decimal中完成所有算术(包括起始值)。 另一种方法是接受微小的错误,直到需要打印或记录结果......然后在出路时四舍五入到小数点后两位。

您可以按照以下方式操作:

#sample
euro = [2, 2.3, 3.0, 4.0, 5.4444]
new_euro = [round(x) if x == round(x) else "{0:.2f}".format(x) for x in euro]
print(new_euro)
[2, '2.30', 3, 4, '5.44']

相关内容

最新更新