如何在熊猫数据框中将Decimal128转换为十进制

时间:2018-11-17 13:30:54

标签: python pandas numpy

我有一个数据帧,其中包含许多(但不是全部)Decimal128列(取自mongodb集合)。我无法对它们执行任何数学运算或比较运算(例如,在'Decimal128'和'float'实例之间不支持'<')。

将所有这些转换为float或我可以使用的一些更简单的内置类型的最快/最简单的方法是什么?

有Decimal128 to_decimal()方法和pandas astype(),但是如何在一个步骤/辅助方法中为所有(decimal128)列做到这一点?

编辑,我已经尝试过:

testdf =  my_df.apply(lambda x: x.astype(str).astype(float) if isinstance(x, Decimal128) else x)

testdf[testdf["MyCol"] > 80].head()

但是我得到了

TypeError: '>' not supported between instances of 'Decimal128' and 'int'

使用.astype(str).astype(float)转换单个列即可。

2 个答案:

答案 0 :(得分:2)

投射完整的DataFrame。

df = df.astype(str).astype(float)

对于单列。 ID 是列的名称。

df["IDs"] = df.IDs.astype(str).astype(float)

测试实施

from pprint import pprint
import bson
df = pd.DataFrame()
y = []
for i in range(1,6):
    i = i *2/3.5
    y.append(bson.decimal128.Decimal128(str(i)))
pprint(y)
df["D128"] = y
df["D128"] = df.D128.astype(str).astype(float)
print("\n", df)

输出:

[Decimal128('0.5714285714285714'),
 Decimal128('1.1428571428571428'),
 Decimal128('1.7142857142857142'),
 Decimal128('2.2857142857142856'),
 Decimal128('2.857142857142857')]

        D128
0  0.571429
1  1.142857
2  1.714286
3  2.285714
4  2.857143

答案 1 :(得分:1)

只需使用:

df = df.astype(float)

您也可以使用applyapplymap(应用智能元素操作),尽管与以前的方法相比效率不高。

df = df.applymap(float)

我无法在系统中重现Decimal128数字。您可以检查下一行是否适合您?

df =  df.apply(lambda x: x.astype(float) if isinstance(x, bson.decimal.Decimal128) else x)

它将检查列的类型是否为Decimal128,然后将其转换为float。