熊猫 >= 0.24
弃用 .values 以支持这些方法!
从 v0.24.0 开始,我们将提供两种全新的首选方法,用于从 Index、Series 和 DataFrame 对象获取 NumPy 数组:它们是 to_numpy()和 .array。关于用法,文档提到:
我们尚未删除或弃用 Series.values 或
DataFrame.values,但我们强烈推荐并使用.array 或
.to_numpy() 代替。
请参阅this section of the v0.24.0 release notes 了解更多信息。
to_numpy() Method
df.index.to_numpy()
# array(['a', 'b'], dtype=object)
df['A'].to_numpy()
# array([1, 4])
默认情况下,返回一个视图。所做的任何修改都会影响原件。
v = df.index.to_numpy()
v[0] = -1
df
A B
-1 1 2
b 4 5
如果您需要副本,请使用to_numpy(copy=True);
v = df.index.to_numpy(copy=True)
v[-1] = -123
df
A B
a 1 2
b 4 5
请注意,此函数也适用于 DataFrames(而 .array 不适用)。
array Attribute
此属性返回支持索引/系列的ExtensionArray 对象。
pd.__version__
# '0.24.0rc1'
# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df
A B
a 1 2
b 4 5
df.index.array
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object
df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64
从这里,可以使用list获取列表:
list(df.index.array)
# ['a', 'b']
list(df['A'].array)
# [1, 4]
或者,直接拨打.tolist():
df.index.tolist()
# ['a', 'b']
df['A'].tolist()
# [1, 4]
关于返回的内容,文档提到,
对于由普通 NumPy 数组支持的 Series 和 Indexes,Series.array
将返回一个新的arrays.PandasArray,这是一个薄(无副本)
包装 numpy.ndarray。 arrays.PandasArray 不是特别
它本身很有用,但它确实提供了与任何
在 pandas 或第三方库中定义的扩展数组。
所以,总而言之,.array 将返回任一
- 支持索引/系列的现有
ExtensionArray,或
- 如果有支持该系列的 NumPy 数组,则会创建一个新的
ExtensionArray 对象作为底层数组的薄包装器。
添加两种新方法的理由
这些功能是在两个 GitHub 问题 GH19954 和 GH23623 下讨论的结果添加的。
具体来说,文档提到了理由:
[...] with .values 不清楚返回值是否是
实际数组,对其进行一些转换,或熊猫自定义之一
数组(如Categorical)。例如,PeriodIndex、.values
每次生成一个新的ndarray 周期对象。 [...]
这两个功能旨在提高 API 的一致性,这是朝着正确方向迈出的重要一步。
最后,.values 在当前版本中不会被弃用,但我预计这可能会在未来的某个时候发生,所以我会敦促用户尽快迁移到更新的 API。