.df.values最快但有dtype和视图限制:丢弃行列标签,混合类型退化为object;推荐用df.to_numpy()替代,支持显式copy控制,注意category/Nullable int列会隐式拷贝。

直接用 .values 最快,但要注意 dtype 和视图行为
绝大多数情况下,df.values 就是你要的答案——它返回一个 ndarray,不复制数据(只要原始 dtype 是同构的),速度最快。但这里有两个关键细节:它会丢弃列名和索引信息,且当 DataFrame 含混合类型(比如一列 int、一列 str)时,会退化为 object 类型数组,失去数值计算优势。
常见错误现象:df.values 返回 array([...], dtype=object),后续调用 .sum() 或矩阵乘法直接报错。
- 先检查
df.dtypes,确保所有列是数值型(int64,float64等) - 若含非数值列,必须先
df.select_dtypes(include='number')过滤 - 想保留原始
dtype精度?用df.to_numpy(dtype=np.float32, copy=False)(Pandas ≥ 0.24)更明确
to_numpy() 是推荐替代,copy 参数决定是否深拷贝
to_numpy() 是 .values 的正式替代,语义更清晰,且支持显式控制内存行为。默认 copy=False,意味着多数情况返回原数据的视图(view),改 ndarray 可能反向影响原始 DataFrame(反之亦然)——这点常被忽略。
使用场景:需要明确控制副本行为,或兼容未来 Pandas 版本(.values 已标记为 deprecated)。
立即学习“Python免费学习笔记(深入)”;
- 要安全修改而不影响原
df:加copy=True,如df.to_numpy(copy=True) - 做高性能计算且确定不改原数据:保持
copy=False(默认),避免额外内存分配 - 强制统一类型:传
dtype=float,自动转换并填充NaN(对 int 列含空值时尤其有用)
带索引/列名的结构化转换?别硬转,用 df.values + 手动重建
NumPy 本身不支持行列标签,所谓“无缝带标签”本质是伪需求。如果你发现代码里反复需要根据列名找列下标,说明不该转 NumPy——该继续用 Pandas 或换用 xarray。
真有特殊需求(比如传给某个只认 ndarray 但需附带列名的 C 扩展)?只能手动拆解:
cols = df.columns.tolist() data = df.values # 或 df.to_numpy() # 此时 cols 是列名列表,data 是数值矩阵,二者独立维护
注意:df.index.values 可取出行索引数组,但它和 df.values 无内存关联,拼接时务必自己对齐。
性能陷阱:df.values 在 category / nullable int 列上可能隐式拷贝
当 DataFrame 含 category、Int64(带缺失的整数)或 string dtype 列时,.values 和 to_numpy() 都会触发隐式类型转换和内存拷贝,耗时可能比预期高 10 倍以上。
验证方法:用 %timeit 对比 df.select_dtypes('number').to_numpy() 和全量 df.to_numpy()。
- 提前用
df.astype('float64')统一数值列,再转 - Category 列想保留编码?用
df['col'].cat.codes.values直接取编码数组 - Nullable int(
Int64)列必须转成float64才能进纯数值数组(因为 NaN 无法存入 int 数组)
转之前多看一眼 df.dtypes,比事后调试类型错误省半小时。混合类型和扩展 dtype 是最常踩的坑,没有之一。


















