`pandas.Series.ravel()`、`pandas.Series.to_numpy()`、`pandas.Series.values` 和 `pandas.Series.array` 之间有什么区别?

What is the difference between `pandas.Series.ravel()`, `pandas.Series.to_numpy()`, `pandas.Series.values` and `pandas.Series.array`?

基本上标题总结了它。我创建了一个虚拟 pandas.Series object 并查找了所有这些属性和方法。文档指出,除了 pandas.array return numpy.ndarray object 之外,所有这些都是。那有什么区别,什么时候应该使用一种方法或属性或另一种方法或属性?我读过,例如 numpy.flatten()numpy.ravel() 之间存在一些差异,前者 return 是新数组,后者 return 是视图。和pandas?

一样
import pandas as pd
s = pd.Series(range(10))
s.ravel()  # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
s.to_numpy()  # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
s.values  # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
s.array  # <PandasArray>

默认情况下,所有这些return一个视图:

import pandas as pd

s = pd.Series(range(10))
rav = s.ravel()  # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
to_num = s.to_numpy()  # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
values = s.values  # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
array = s.array  # <PandasArray>

rav[0] = 1
print('ravel', s[0])

to_num[0] = 2
print('to_numpy', s[0])

values[0] = 3
print('values', s[0])

array[0] = 4
print('array', s[0])
ravel 1
to_numpy 2
values 3
array 4

然而,to_numpy() 具有 copy 参数(默认 False),您可以使用该参数 return 底层数组的完整副本:

to_num_copy = s.to_numpy(copy=True)  # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

to_num_copy[0] = 5
print('to_numpy with copy', s[0])
to_numpy with copy 4

最后,当列的 dtype 不是同类 and/or 不是 numpy dtype 时,to_numpy() 有时也可能 return 一个副本。相反,如果我们想严格避免复制,应该使用 .array

请注意,.values 被认为是旧的,应该使用 .arrayto_numpy()。更多信息 in this answer.