我有一个数据帧,其中包含许多(但不是全部)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)转换单个列即可。
答案 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)