【问题标题】:Converting schemas via pandas vs pyarrow通过 pandas 与 pyarrow 转换模式
【发布时间】:2021-05-21 21:06:22
【问题描述】:

我在 pandas 中有一个数据框,我想使用 pyarrow 将其写成镶木地板。

我还需要能够指定列类型。如果我通过 pandas 更改类型,则不会出错;但是当我通过 pyarrow 更改它时,出现错误。查看示例:

给定

import pandas as pd
import pyarrow as pa

data = {"col": [86002575]}
df = pd.DataFrame(data)

通过熊猫

df = df.astype({"col": "float32"})

table = pa.Table.from_pandas(df)

没有错误

通过 PyArrow

schema = pa.Schema.from_pandas(df)
i = schema.get_field_index("col")
schema = schema.set(i, pa.field("col", pa.float32()))

table = pa.Table.from_pandas(df, schema=schema)

得到错误:

pyarrow.lib.ArrowInvalid: ('Integer value 86002575 not in range: -16777216 to 16777216', 'Conversion failed for column col with type int64')

我什至不认识那个范围。是不是在两者之间转换的时候尝试做一些中间转换?

【问题讨论】:

    标签: python pandas dataframe pyarrow


    【解决方案1】:

    从一种类型转换为另一种类型时,箭头比熊猫严格得多。

    在您的情况下,您正在从 int64 转换为 float32。因为它们是浮点整数精确表示的限制,箭头限制了您可以转换为 16777216 的范围。超过该限制,浮点精度会变差,如果您要将浮点值转换回 int,您就是不保证具有相同的值。

    不过,您可以轻松忽略这些检查:

    schema_float32 = pa.schema([pa.field("col", pa.float32())])
    table = pa.Table.from_pandas(df, schema=schema_float32, safe=False)
    

    编辑:

    箭头中没有明确记录。这是常见的软件工程知识。

    In wikipedia:

    任何绝对值小于 2^24 的整数都可以精确 以单精度格式表示,任何整数 绝对值小于 2^53 可以用双精度精确表示 精度格式。此外,2 倍这样的宽范围的功率 可以表示一个数字。这些属性有时用于 纯整数数据,在具有 双精度浮点数,但只有 32 位整数。

    2^24 = 16777216

    箭头中没有很好的记录。你可以看看code

    【讨论】:

    • 谢谢!有这方面的一些文件吗?
    猜你喜欢
    • 2019-03-21
    • 2021-03-18
    • 2021-12-13
    • 2017-10-23
    • 2022-08-24
    • 2021-08-31
    • 2018-09-05
    • 2019-11-20
    • 2015-10-20
    相关资源
    最近更新 更多