【问题标题】:How to convert Decimal128 to decimal in pandas dataframe如何在熊猫数据框中将 Decimal128 转换为十进制
【发布时间】:2018-11-19 00:49:30
【问题描述】:

我有一个包含许多(但不是全部)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()

但我明白了:

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

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

【问题讨论】:

  • 我认为 isinstance 方法返回 false,因此列没有被转换为浮点数。我想如果你使用 Decimal128 的确切类,这个方法就可以了。
  • 它们都是 'object' 的实例,而不是 str 或 Decimal128。
  • 您能展示一下您的数据框的外观吗?
  • 看起来大多数都是正确的,除了字符串作为 dtype 对象进来
  • 认为我必须逐列而不是自动化它。感谢您的帮助

标签: python pandas numpy


【解决方案1】:

投射完整的 DataFrame。

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

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

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

【讨论】:

  • 给出“TypeError:float() 参数必须是字符串或数字,而不是'Decimal128'”
  • @Rich 更新了答案。你能不能现在检查一下,让我知道这是否有效。 :)
  • 通过字符串投射似乎有效。看起来效率不高,但是嘿嘿
【解决方案2】:

只需使用:

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 类型,然后将其转换为浮点数。

【讨论】:

  • 你能单独为 decimal128 列执行此操作吗?例如foreach 列如果 decimal128 然后转换,否则不管它?
  • 嗨@Rich 我已经编辑了我的答案。你能看看并告诉我它是否适合你吗?
猜你喜欢
  • 2019-04-14
  • 2021-08-19
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 2023-03-18
  • 2015-06-11
相关资源
最近更新 更多