支持的数据类型#
cuDF 支持 NumPy 和 Pandas 支持的多种数据类型,包括数值、日期时间、时间差、类别和字符串数据类型。我们还提供了用于处理十进制、列表式和字典式数据的特殊数据类型。
cuDF 中的所有数据类型都是可为空的。
数据类型 |
数据类型(s) |
---|---|
有符号整数 |
|
无符号整数 |
|
浮点 |
|
日期时间 |
|
Timedelta (持续时间) |
|
类别 |
|
字符串 |
|
十进制 |
|
列表 |
|
Struct |
NumPy 数据类型#
我们使用 NumPy 数据类型表示整数、浮点、日期时间、时间差和字符串数据类型。因此,就像在 NumPy 中一样,np.dtype("float32")
、np.float32
和 "float32"
都是指定 float32
数据类型的可接受方式。
>>> import cudf
>>> s = cudf.Series([1, 2, 3], dtype="float32")
>>> s
0 1.0
1 2.0
2 3.0
dtype: float32
关于 object
的说明#
cuDF 中与字符串数据关联的数据类型是 "np.object"
。
>>> import cudf
>>> s = cudf.Series(["abc", "def", "ghi"])
>>> s.dtype
dtype("object")
这是为了与 Pandas 兼容,但这可能具有误导性。在 NumPy 和 Pandas 中,"object"
是与由任意 Python 对象(不仅仅是字符串)组成的数据关联的数据类型。然而,cuDF 不支持存储任意 Python 对象。
十进制数据类型#
我们提供了用于处理十进制数据的特殊数据类型,即 Decimal32Dtype
、Decimal64Dtype
和 Decimal128Dtype
。当您需要存储精度高于浮点表示允许的值时,请使用这些数据类型。
cuDF 中的十进制数据类型基于定点表示。十进制数据类型由一个 精度 和一个 小数位数 组成。精度表示该 dtype 中每个值的总位数。例如,与十进制值 1.023
关联的精度是 4
。小数位数是小数点右边的总位数。与值 1.023
关联的小数位数是 3。
每种十进制数据类型都有一个最大精度限制
>>> cudf.Decimal32Dtype.MAX_PRECISION
9.0
>>> cudf.Decimal64Dtype.MAX_PRECISION
18.0
>>> cudf.Decimal128Dtype.MAX_PRECISION
38
创建十进制 Series 的一种方法是使用 decimal.Decimal 类型的值。
>>> from decimal import Decimal
>>> s = cudf.Series([Decimal("1.01"), Decimal("4.23"), Decimal("0.5")])
>>> s
0 1.01
1 4.23
2 0.50
dtype: decimal128
>>> s.dtype
Decimal128Dtype(precision=3, scale=2)
注意结果的数据类型:1.01
、4.23
、0.50
都可以用至少 3 的精度和至少 2 的小数位数来表示。
然而,值 1.234
需要至少 4 的精度和至少 3 的小数位数,并且无法使用此数据类型完全表示。
>>> s[1] = Decimal("1.234") # raises an error
嵌套数据类型(List
和 Struct
)#
ListDtype
和 StructDtype
是 cuDF 中用于处理列表式和字典式数据的特殊数据类型。它们被称为“嵌套”数据类型,因为它们使您能够存储列表的列表、列表的 struct 或列表的列表的 struct 等等。
您可以分别从现有的 Pandas 列表 Series 和字典 Series 创建列表 Series 和 struct Series
>>> psr = pd.Series([{'a': 1, 'b': 2}, {'a': 3, 'b': 4}])
>>> psr
0 {'a': 1, 'b': 2}
1 {'a': 3, 'b': 4}
dtype: object
>>> gsr = cudf.from_pandas(psr)
>>> gsr
0 {'a': 1, 'b': 2}
1 {'a': 3, 'b': 4}
dtype: struct
>>> gsr.dtype
StructDtype({'a': dtype('int64'), 'b': dtype('int64')})
或者通过使用支持嵌套数据的文件格式从磁盘读取它们。
>>> pdf = pd.DataFrame({"a": [[1, 2], [3, 4, 5], [6, 7, 8]]})
>>> pdf.to_parquet("lists.pq")
>>> gdf = cudf.read_parquet("lists.pq")
>>> gdf
a
0 [1, 2]
1 [3, 4, 5]
2 [6, 7, 8]
>>> gdf["a"].dtype
ListDtype(int64)