1

下午好,

我想使用round half up函数将数据框中的列四舍五入到x个位置,以确保任何0.5值始终按照传统的舍入规则四舍五入,并避免“银行家四舍五入”问题。

我拥有的数据框示例是:

import pandas as pd
import decimal

Data = {'Code' : ['x', 'x', 'x'],
        'Disaggregation' : ['a', 'b', 'Total'],
        'Numerator' : [19.3276542, 82.136492834, 101.192747123]}
       
Data = pd.DataFrame(Data, columns = ['Code', 'Disaggregation', 'Numerator'])

我得到的代码不起作用,如下所示:

Data['Numerator'] = (Decimal(Data['Numerator']).quantize(Decimal('.1'), rounding=ROUND_HALF_UP))

产生以下错误:不支持从系列到小数的转换。

数据框的 Dtypes 是:

Code               object
Disaggregation     object
Numerator         float64
dtype: object

任何人都有任何线索我怎样才能让它工作?(当然数据框要大得多,因此我需要在列上工作)。

非常感谢您提前为此提供的帮助。

4

3 回答 3

1

尝试:

Data['Numerator'] = Data.Numerator.apply(lambda x : round(x, 1))

将数字更改为所需的舍入值

输出:

Code    Disaggregation  Numerator
0   x   a               19.3
1   x   b               82.1
2   x   Total           101.2
于 2020-07-24T01:08:31.963 回答
1

您正在执行将 aseries作为参数传递的舍入操作。相反,您需要修复此问题以对系列中的每个值执行四舍五入。我建议你在函数中使用mapwith alambda来做到这一点:

Data['Numerator'] = Data['Numerator'].map(lambda x: Decimal(x).quantize(Decimal('.1'), rounding=ROUND_HALF_UP))

我们得到的输出和预期的一样:

  Code Disaggregation Numerator
0    x              a      19.3
1    x              b      82.1
2    x          Total     101.2
于 2020-07-24T01:12:06.940 回答
0

聚会迟到了。在应用 Decimal() 之前尝试将浮点数转换为文本。您将得到 ROUND_HALF_UP 的结果。

import pandas as pd
from decimal import Decimal, ROUND_HALF_UP

Data = {'Code' : ['x', 'x', 'x'],
        'Disaggregation' : ['a', 'b', 'Total'],
        'Numerator' : [19.3276, 82.1365, 101.1927]}

Data = pd.DataFrame(Data, columns = ['Code', 'Disaggregation', 'Numerator'])
Data['Numerator'].map(lambda x: Decimal(str(x)).quantize(Decimal('.100'), rounding=ROUND_HALF_UP))

这就是我结束的。

  • 19.328
  • 82.137
  • 101.193
于 2021-03-12T20:20:50.393 回答