数据类型#
Vaex 是一个混合型 DataFrame - 它支持 numpy 和 arrow 数据类型。本页详细说明了 Vaex 支持哪些数据类型,以及我们希望未来支持哪些数据类型。我们还提供了一些关于如何处理常见数据结构的建议。
为了获得一些额外的见解,欢迎您查看这篇文章。
Vaex中支持的数据类型#
在下表中我们定义:
支持:该类型的列或表达式可以存在,并且可以存储在至少一种文件格式中;
不支持:当前Vaex DataFrame中不支持该类型的列或表达式,但未来可能会添加支持;
不支持:该数据类型在Vaex中将不再支持。
框架 |
数据类型 |
支持情况 |
备注 |
|---|---|---|---|
Python |
|
是 |
将被转换为 |
Python |
|
yes |
将被转换为 |
Python |
|
尚未 |
|
Python |
|
尚未 |
|
Python |
|
yes |
将被转换为Arrow数组 |
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
是 |
操作应向上转换为 |
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
否 |
|
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
是 |
操作应升级为 |
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
是 |
|
|
|
yes |
目前还不能导出到HDF5,但有可能 |
|
|
是 |
|
|
|
尚未 |
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']