使用df.to_numpy ()
它比df好。价值观,这就是为什么
现在是弃用values和as_matrix()的时候了。
pandas v0.24.0引入了两个从pandas对象中获取NumPy数组的新方法:
to_numpy(),它定义在Index、Series和DataFrame对象上
数组,它只在Index和Series对象上定义。
如果你访问v0.24文档中的.values,你会看到一个大大的红色警告,上面写着:
警告:我们建议使用DataFrame.to_numpy()代替。
有关更多信息,请参阅v0.24.0发行说明的这一部分和这个答案。
* - to_numpy()是我推荐的方法,适用于任何需要在未来的许多版本中可靠运行的生产代码。但是,如果您只是在jupyter或终端中制作一个便签本,使用.values来节省几毫秒的输入时间是允许的例外。你可以随时添加合适的n完成后。
更好的一致性:to_numpy()
为了在整个API中保持更好的一致性,引入了一个新的to_numpy方法,用于从dataframe中提取底层NumPy数组。
# Setup
df = pd.DataFrame(data={'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]},
index=['a', 'b', 'c'])
# Convert the entire DataFrame
df.to_numpy()
# array([[1, 4, 7],
# [2, 5, 8],
# [3, 6, 9]])
# Convert specific columns
df[['A', 'C']].to_numpy()
# array([[1, 7],
# [2, 8],
# [3, 9]])
如上所述,此方法也定义在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 C
a -1 4 7
b 2 5 8
c 3 6 9
如果需要复制,则使用to_numpy(copy=True)。
pandas >=扩展类型1.0更新
如果你用的是熊猫。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
# Correct
a.to_numpy(dtype='float', na_value=np.nan)
# array([ 1., 2., nan])
# Also correct
a.to_numpy(dtype='int', na_value=-1)
# array([ 1, 2, -1])
这在文档中被提到了。
如果你需要结果中的dtypes…
如另一个答案DataFrame所示。To_records是一种很好的方法。
df.to_records()
# rec.array([('a', 1, 4, 7), ('b', 2, 5, 8), ('c', 3, 6, 9)],
# dtype=[('index', 'O'), ('A', '<i8'), ('B', '<i8'), ('C', '<i8')])
不幸的是,to_numpy不能做到这一点。然而,作为替代,你可以使用np.rec.fromrecords:
v = df.reset_index()
np.rec.fromrecords(v, names=v.columns.tolist())
# rec.array([('a', 1, 4, 7), ('b', 2, 5, 8), ('c', 3, 6, 9)],
# dtype=[('index', '<U1'), ('A', '<i8'), ('B', '<i8'), ('C', '<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())
12.9 ms ± 511 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
9.56 ms ± 291 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
添加新方法的基本原理
to_numpy()(除了数组之外)是在两个GitHub问题GH19954和GH23623下讨论的结果。
具体来说,文档中提到了基本原理:
[…返回值是否为.values还不清楚
实际的阵列,它的一些变换,或熊猫的习俗之一
数组(如Categorical)。例如,对于PeriodIndex, .values
每次生成一个新的周期对象ndarray。[…]
to_numpy旨在提高API的一致性,这是朝着正确方向迈出的重要一步。.values在当前版本中不会被弃用,但我预计这在未来的某个时候可能会发生,因此我会敦促用户尽快迁移到更新的API。
其他解决方案的批评
DataFrame。如前所述,Values具有不一致的行为。
DataFrame.get_values()在v1.0中被悄悄删除,之前在v0.25中已弃用。在此之前,它只是一个DataFrame的包装器。价值观,所以上面所说的一切都适用。
datafframe .as_matrix()在v1.0中被移除,之前在v0.23中已弃用。不要使用!