HOWTO · Pandas

如何将 Pandas Dataframe 转换为 NumPy 数组

使用 to_numpy() 将 Pandas Dataframe 转换为 NumPy 数组、包含其索引,或使用 to_records() 创建结构化记录。

本页内容

要转换为常规 NumPy 数组,请调用 DataFrame.to_numpy()。维护旧代码时可以使用旧式 DataFrame.values 属性;如果需要通过名称访问字段,则可以选择 DataFrame.to_records()。示例使用固定数据,需要安装 pandas 和 NumPy。常规数组只有一种 dtype,因此不同列类型可能会被表示为共同的 dtype。

使用 DataFrame.to_numpy() 转换为 NumPy 数组

to_numpy() 会将表格数据返回为二维 NumPy 数组。数组的行顺序与 DataFrame 中的行顺序一致,列顺序也与 DataFrame 中的列顺序一致。数组形状为 (行数, 列数);DataFrame 的索引和列标签不会包含在数组中。返回对象是 ndarray,因此可以直接传给后续的 NumPy 函数。

下面的示例创建一个小型表格,将其值转换为数组,并打印数组、形状和结果类型:

import pandas as pd

df = pd.DataFrame({"name": ["Ada", "Lin"], "score": [91, 88]})
array = df.to_numpy()

print(array)
print(array.shape)
print(type(array))
[['Ada' 91]
 ['Lin' 88]]
(2, 2)
<class 'numpy.ndarray'>

如果需要指定 dtype,可以向 to_numpy() 传入 dtype=,例如 df.to_numpy(dtype="float64")。这会要求 NumPy 将各个值转换为指定 dtype;请确保该 dtype 能表示所有列中的值。对于字符串和数字混合的数据,数值 dtype 无法在不进行转换的情况下表示所有值,因此默认的共同 dtype 可能是 object。

兼顾旧式 DataFrame.values 用法并包含索引

DataFrame.values 是一个属性,访问时不需要加括号。它会将表格数据作为数组返回;不过,to_numpy() 能更明确地表达转换操作,也是新代码的推荐写法。使用 values 的现有代码仍可像读取属性一样读取它。

若要将索引值作为一列包含在结果中,请先调用 reset_index() 再进行转换。默认情况下,reset_index() 会将旧索引放在第一列,并创建新的默认整数索引。如果希望列名具有实际含义,可以先重命名索引。有关其选项,请参阅 reset_index()。

import pandas as pd

df = pd.DataFrame({"score": [91, 88]}, index=["Ada", "Lin"])

legacy_array = df.values
with_index = df.reset_index().to_numpy()

print(legacy_array)
print(with_index)
[[91]
 [88]]
[['Ada' 91]
 ['Lin' 88]]

由于索引标签是字符串,而分数值是整数,常规数组需要采用共同的 dtype,因此可能会使用 object。只有调用 reset_index() 后,索引才会包含在结果中;直接转换原始 DataFrame 不会包含索引标签。如果需要保留各列的类型和名称以便分别访问,可以使用结构化记录数组。

使用 DataFrame.to_records() 转换为结构化 NumPy 数组

to_records() 会返回结构化 NumPy 数组,并为 DataFrame 的每一列创建一个具名字段。默认情况下,结果还会将索引包含在名为 index 的字段中。可以按名称访问字段,结构化 dtype 也会记录各字段各自的类型。当代码需要按字段名称选择数据,而不是依赖列的位置时,这种形式很有用。

import pandas as pd

df = pd.DataFrame({"name": ["Ada", "Lin"], "score": [91, 88]})
records = df.to_records()

print(records["name"])
print(records["score"])
print(records.dtype.names)
['Ada' 'Lin']
[91 88]
('index', 'name', 'score')

设置 index=False 可将索引排除在结果之外;如果需要指定索引字段的 dtype,则可以提供 index_dtypes=。需要常规数组时选择 to_numpy();需要具名字段或保留各列的 dtype 信息时选择 to_records()。