如何将 pandas 数据框中的 Decimal128 转换为十进制

Ric*_*ich 1 python numpy pandas

我有一个包含许多(但不是全部)Decimal128 列(取自 mongodb 集合)的数据框。我无法对它们执行任何数学或比较(例如,“Decimal128”和“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()
Run Code Online (Sandbox Code Playgroud)

但我得到:

TypeError: '>' not supported between instances of 'Decimal128' and 'int'
Run Code Online (Sandbox Code Playgroud)

使用 .astype(str).astype(float) 转换单个列是有效的。

Src*_*Cde 5

投射完整的数据帧。

df = df.astype(str).astype(float)
Run Code Online (Sandbox Code Playgroud)

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

df["IDs"] = df.IDs.astype(str).astype(float)
Run Code Online (Sandbox Code Playgroud)

测试实施

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)
Run Code Online (Sandbox Code Playgroud)

输出:

[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
Run Code Online (Sandbox Code Playgroud)