数据类型#

Vaex 是一个混合型 DataFrame - 它支持 numpyarrow 数据类型。本页详细说明了 Vaex 支持哪些数据类型,以及我们希望未来支持哪些数据类型。我们还提供了一些关于如何处理常见数据结构的建议。

为了获得一些额外的见解,欢迎您查看这篇文章

Vaex中支持的数据类型#

在下表中我们定义:

  • 支持:该类型的列或表达式可以存在,并且可以存储在至少一种文件格式中;

  • 不支持:当前Vaex DataFrame中不支持该类型的列或表达式,但未来可能会添加支持;

  • 不支持:该数据类型在Vaex中将不再支持。

框架

数据类型

支持情况

备注

Python

int

将被转换为numpy数组

Python

float

yes

将被转换为numpy数组

Python

datetime

尚未

Python

timedelta

尚未

Python

str

yes

将被转换为Arrow数组

numpy

int8

numpy

int16

numpy

int32

numpy

int64

numpy

float16

操作应向上转换为 float64

numpy

float32

numpy

float64

numpy

datetime64

numpy

timedelta64

numpy

object ('O')

arrow

int8

arrow

int16

arrow

int32

arrow

int64

arrow

float16

操作应升级为 float64

arrow

float32

arrow

float64

arrow

date32

arrow

time64

arrow

time32

arrow

duration

arrow

struct

yes

目前还不能导出到HDF5,但有可能

arrow

dictionary

arrow

union

尚未

Vaex 中数据类型的一般建议#

Vaex 要求每一列或表达式必须是单一数据类型,就像数据库中的情况一样。如果一列包含不同的数据类型,可能会导致数据类型 object,这是不支持的,并且也可能引发各种问题。

一般建议是在使用Vaex之前,准备数据使每列具有统一的数据类型。

[1]:
import vaex
import numpy as np
import pyarrow as pa

高维数组#

Vaex 支持高维的 numpy 数组。唯一的要求是这些数组必须具有相同的形状。目前,包含高维 numpy 数组的 DataFrame 只能导出为 HDF5 格式。我们希望 arrow 很快会添加对此的支持,这样我们也可以将这些列导出为 arrow 和 parquet 格式。

例如:

[2]:
x = np.random.randn(100, 10, 10)
df = vaex.from_arrays(x=x)
df
[2]:
# x
0 'array([[ 1.83097431e+00, -9.90736404e-01, -8.85...
1 'array([[ 1.99466370e+00, 8.92569841e-01, 2.11...
2 'array([[-0.69977757, 0.61319317, 0.01313954, ...
3 'array([[ 0.25304255, -0.84425097, -1.18806199, ...
4 'array([[ 0.31611316, -1.36148251, 1.67342284, ...
... ...
95'array([[-0.60892972, -0.52389881, -0.92493729, ...
96'array([[ 1.10435809, 1.06875633, 1.45812865, ...
97'array([[-0.59311765, 0.10650056, -0.14413671, ...
98'array([[-0.24467361, -0.40743024, 0.6914302 , ...
99'array([[-1.0646038 , 0.53975242, -1.70715565, ...

我们还可以将嵌套的列表结构传递给Vaex。这将被即时转换为numpy的ndarray。与之前一样,条件是生成的ndarray必须是规则的。

例如:

[3]:
x = [[1, 2], [3, 4]]
df = vaex.from_arrays(x=x)
df
[3]:
# x
0数组([1, 2])
1数组([3, 4])

如果我们碰巧有一个不规则的列表的列表,即内部列表长度不同的列表的列表,我们首先需要将其转换为arrow数组,然后再传递给vaex:

[4]:
x = [[1, 2, 3, 4, 5], [6, 7], [8, 9, 10]]
x = pa.array(x)
df = vaex.from_arrays(x=x)
df
[4]:
# x
0[1, 2, 3, 4, 5]
1[6, 7]
2[8, 9, 10]

请注意,目前arrow结构体和列表暂时无法导出到HDF5。

Vaex中的字符串支持#

Vaex 在底层使用 arrow 来处理字符串。传递给 Vaex DataFrame 的任何字符串都将转换为 arrow 类型。

例如:

[5]:
x = ['This', 'is', 'a', 'string', 'column']
y = np.array(['This', 'is', 'one', 'also', None])

df = vaex.from_arrays(x=x, y=y)
print(df)

display(df.x.values)
display(df.y.values)
  #  x       y
  0  This    This
  1  is      is
  2  a       one
  3  string  also
  4  column  --
<pyarrow.lib.StringArray object at 0x7f277b9b9040>
[
  "This",
  "is",
  "a",
  "string",
  "column"
]
<pyarrow.lib.StringArray object at 0x7f277b9b9d60>
[
  "This",
  "is",
  "one",
  "also",
  null
]

了解Vaex中的字符串操作也适用于字符串列表的列表(以及字符串列表的列表的列表,依此类推)是很有用的。

[6]:
x = pa.array([['Reggie', 'Miller'], ['Michael', 'Jordan']])
df = vaex.from_arrays(x=x)
df.x.str.lower()
[6]:
Expression = str_lower(x)
Length: 2 dtype: list<item: string> (expression)
------------------------------------------------
0   ['reggie', 'miller']
1  ['michael', 'jordan']