弃用的用法values
和as_matrix()
!
pandas v0.24.0引入了两种从pandas对象获取NumPy数组的新方法:
to_numpy()
,其定义上Index
,Series,
和DataFrame
对象,并
array
,仅在Index
和Series
对象上定义。
如果您访问的v0.24文档.values
,则会看到一个红色的大警告:
警告:我们建议DataFrame.to_numpy()
改为使用。
请参阅v0.24.0发行说明的本部分以及此答案以获取更多信息。
本着整个API更好的一致性的精神,to_numpy
引入了一种新方法来从DataFrames中提取底层的NumPy数组。
# Setup.
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c'])
df.to_numpy()
array([[1, 4],
[2, 5],
[3, 6]])
如上所述,该方法也在Index
和Series
对象上定义(请参见此处)。
df.index.to_numpy()
# array(['a', 'b', 'c'], dtype=object)
df['A'].to_numpy()
# array([1, 2, 3])
默认情况下,将返回视图,因此所做的任何修改都会影响原始视图。
v = df.to_numpy()
v[0, 0] = -1
df
A B
a -1 4
b 2 5
c 3 6
如果您需要副本,请使用to_numpy(copy=True
。
Pandas> = 1.0更新为ExtensionTypes
如果您使用的是熊猫1.x,那么您可能会更多地处理扩展类型。您必须多加注意,这些扩展名类型已正确转换。
a = pd.array([1, 2, None], dtype="Int64")
a
<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64
# Wrong
a.to_numpy()
# array([1, 2, <NA>], dtype=object) # yuck, objects
# Right
a.to_numpy(dtype='float', na_value=np.nan)
# array([ 1., 2., nan])
在文档中对此进行了标注。
如果您需要dtypes
...
如另一个答案所示,DataFrame.to_records
是执行此操作的好方法。
df.to_records()
# rec.array([('a', -1, 4), ('b', 2, 5), ('c', 3, 6)],
# dtype=[('index', 'O'), ('A', '<i8'), ('B', '<i8')])
to_numpy
不幸的是,这不能做到。但是,您也可以使用np.rec.fromrecords
:
v = df.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())
# rec.array([('a', -1, 4), ('b', 2, 5), ('c', 3, 6)],
# dtype=[('index', '<U1'), ('A', '<i8'), ('B', '<i8')])
在性能方面,它几乎是相同的(实际上,使用rec.fromrecords
速度要快一些)。
df2 = pd.concat([df] * 10000)
%timeit df2.to_records()
%%timeit
v = df2.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())
11.1 ms ± 557 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
9.67 ms ± 126 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
添加新方法的理由
to_numpy()
(除了array
)作为两个GitHub问题GH19954和GH23623下讨论的结果而添加。
具体来说,文档提到了基本原理:
[...] .values
尚不清楚返回的值是实际数组,它的某种转换还是熊猫自定义数组之一(如Categorical
)。例如,使用PeriodIndex
,每次都会.values
生成一个新ndarray
的周期对象。[...]
to_numpy
旨在提高API的一致性,这是朝正确方向迈出的重要一步。.values
不会在当前版本中被弃用,但我希望这种情况可能会在将来的某个时刻发生,因此,我敦促用户尽快向较新的API迁移。
批判其他解决方案
DataFrame.values
如前所述,具有不一致的行为。
DataFrame.get_values()
只是一个包装器DataFrame.values
,因此上述所有内容均适用。
DataFrame.as_matrix()
现在已弃用,请勿使用!