【问题标题】:how do i manipulate decimals in pandas data frame我如何在熊猫数据框中操作小数
【发布时间】:2018-05-04 22:40:54
【问题描述】:

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

euro    token
200.0   65.78947368421053
9997.8  2631.0

只要只有 .0,我就想去掉 .0,但是当“欧元”中有一个小数点时,比如 0.8,我希望像通常使用货币一样使用小数点。 因此,“欧元”列的定义将是 2 位小数,除非只有 0。对于“令牌”列,它将是 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 行搞砸了。我不知道如何解决这个问题。

谢谢曼努埃尔

【问题讨论】:

    标签: python pandas formatting numbers decimal


    【解决方案1】:

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

    对 OP 评论的回应

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

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

    回复下一条评论

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

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

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

    【讨论】:

    • 我需要在这件事上回复你。我想我理解你所说的并弄清楚了格式部分。但是我仍然有一个问题。我有一个变量exchange_rate = 3.8 和一个带有数字作为浮点数的数据框。我现在需要将数据框中的每个数字除以 exchange_rate。我导入了熊猫和小数。示例:df['euro'].apply(Decimal) / Decimal(exchange_rate) where df['euro'] = 760。这应该让我正好得到 200,但它给了我 200.000000000000009349。我不明白为什么。
    • 太棒了。非常感谢你。我想我现在明白了。 :-)
    • 我需要再回来。相信我,我不会。但是这个f...浮动让我发疯了。这一次,我得到了一个包含两列“电子邮件”和“欧元”的 Excel 文档。接缝特别有两个值1998,80和9997,80。只要我不碰它们,一切都很好。但是当我开始计算时,它变得疯狂。例如,当我将它们乘以 100 以去除小数时,我得到 199879 和 999779 而不是 199880 和 999780。我已经尝试将它作为对象而不是浮点数导入,但这不知何故它自己改变了。我将更新上面的示例。请帮助:-)
    • 您可以查看有关处理货币金额的网页; Stack Overflow 并不是真正用于对诸如此类的主题进行连续细化。
    【解决方案2】:

    你可以这样:

    #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']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多