Python 如何处理数据帧中的小数

Python 如何处理数据帧中的小数,python,pandas,formatting,numbers,decimal,Python,Pandas,Formatting,Numbers,Decimal,我有这样一个数据帧(df): euro token 200.0 65.78947368421053 9997.8 2631.0 当只有.0时,我想去掉.0,但当“欧元”中有一个像.8这样的小数点时,我想用小数点,就像你们通常使用货币一样。 所以“欧元”列的定义是2位小数,除非只有0位。对于“token”列,它将是18位小数,不显示尾随的0,当只有0时,不显示小数 我现在读了很多书,但都不知道从哪里开始。有人吗 关于进一步问题的最新示例 现在我正在尝试修正2位小数。:-) 正如你所看

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

euro    token
200.0   65.78947368421053
9997.8  2631.0
当只有.0时,我想去掉.0,但当“欧元”中有一个像.8这样的小数点时,我想用小数点,就像你们通常使用货币一样。 所以“欧元”列的定义是2位小数,除非只有0位。对于“token”列,它将是18位小数,不显示尾随的0,当只有0时,不显示小数

我现在读了很多书,但都不知道从哪里开始。有人吗

关于进一步问题的最新示例 现在我正在尝试修正2位小数。:-)

正如你所看到的,它在第2排和第4排都搞砸了。我想不出怎么解决这个问题


感谢Manuel

如果您需要将存储的值精确到小数点后两位,那么您应该使用
decimal
软件包进行算术运算。如果您希望保持完全的准确性,但只在输出上打印两位小数,那么请参阅有关Python格式的各种教程,例如
“{.2f}”.format(euro)

对OP评论的回应

但是看看你是如何得到汇率的:你分配了一个
浮动
值,因此它不再保证在10进制下精确为3.8;相反,它是二进制中最接近的近似值。我得到
3.7999999999998223643160599749535322183310546875

如果您希望从打印页上看到的内容得到准确的结果,那么您不能在计算中使用分数和非二进制数字。要获得精确的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']

我需要在这件事上回复你。我想我理解了你说的话,并且理解了格式部分。但我仍然有一个问题,我的头围绕着它。我有一个变量
exchange\u rate=3.8
和一个数据帧,其中数字是浮点数。我现在需要将数据帧中的每个数字除以汇率。我进口了熊猫和十进制。示例:
df['euro']。应用(十进制)/十进制(汇率)
其中df['euro']=760。这应该正好是200,但它给了我200.000000000000009349。我不明白为什么,太好了。非常感谢你。我想我现在明白了。:-)我需要再回来。相信我,我不想。但这件事。。。浮子快把我逼疯了。这一次,我得到了一个Excel文档,其中有两列“email”和“euro”。尤其应该有两个值1998,80和9997,80。只要我不碰它们,一切都好。但当我开始计算时,它变得疯狂。例如,当我将它们乘以100以去除小数时,得到的是199879和999779,而不是199880和999780。我已经尝试将它作为对象而不是float导入,但它自己却发生了变化。我将更新上面的示例。请帮助:-)你可以在一个关于使用货币金额的网页上查找;堆栈溢出实际上并不是为了对这样的主题进行连续的细化。
>>> np.round(0.8, 2)
0.80000000000000004
#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']