python - 通过 pandas 与 pyarrow 转换模式
问题描述
我在 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')
我什至不认识那个范围。在两者之间转换时是否尝试进行一些中间转换?
解决方案
从一种类型转换为另一种类型时,arrow 比 pandas 严格得多。
在您的情况下,您正在从 int64 转换为 float32。因为它们是浮点整数精确表示的限制,箭头限制了您可以转换为 16777216 的范围。超过该限制,浮点精度会变差,如果您要将浮点值转换回 int,您就是不保证具有相同的值。
不过,您可以轻松忽略这些检查:
schema_float32 = pa.schema([pa.field("col", pa.float32())])
table = pa.Table.from_pandas(df, schema=schema_float32, safe=False)
编辑:
它没有在箭头中明确记录。这是常见的软件工程知识。
任何绝对值小于 2^24 的整数都可以用单精度格式精确表示,任何绝对值小于 2^53 的整数都可以用双精度格式精确表示。此外,可以表示该数的 2 倍的广泛幂。这些属性有时用于纯整数数据,以在具有双精度浮点但只有 32 位整数的平台上获取 53 位整数。
2^24 = 16777216
它没有很好地记录在箭头中。你可以看看代码
推荐阅读
- flutter - 无法在颤振中访问提供者
- python - python中关于线性代数语法的困惑
- flutter - 设置 Flutter 日志级别 / Flutter 打印数千条详细行
- html - 具有最大高度的 flex 元素的列对齐
- objective-c - Swift @objc 协议不能用作符合协议 'Equatable' 的类型,因为 'Equatable' 具有静态要求
- python - 将全局变量传递给 PyQt5 中的函数
- chromedp - 如何使用 chromedp 在同一浏览器的新窗口中打开选项卡?
- security - 在杜鹃报告屏幕截图中隐藏命令提示符
- python - 设置“matplotlib.rcParams['text.usetex'] = True”以在标签中使用 LaTeX 并使用德语语言环境使用逗号时的 Python 图问题
- graphql - 突变后自动更新 apollo 客户端缓存不影响现有查询