将pandas数据框转换为numpy数组——应该首选哪种方法?

9

我需要将一个大型数据框转换为numpy数组。仅保留数值和类型。

我知道有一些被充分记录的方法可以这样做。

那么,应该优先选择哪种方法呢?

df.values
df._as_matrix()
pd.to_numeric(df)
... others ...

决策因素:

  • 效率

  • 安全地操作nan,np.nans和其他可能的意外值

  • 数值稳定


2
海报看起来最常见的问题是当数据框包含混合项目和列的数据类型或整个框架为“object”类型时。 看来pandas很容易切换到“object”以适应字符串和“nan”(浮点数)。 另一方面,numpy使用“object”来处理大小可变的子列表。 - hpaulj
2个回答

15

你提到的这些函数有不同的作用。

  1. pd.to_numeric: 如果你的数据当前未以数值形式存储,或者你希望通过 downcast='float'downcast='integer' 将其转换为最优类型,可以使用此功能来转换数据类型。

  2. pd.DataFrame.to_numpy()(v0.24+)或pd.DataFrame.values:使用此功能获取数据框的 numpy 数组表示。

  3. pd.DataFrame.as_matrix:请勿使用此功能。它仅包含用于向后兼容性。


7
在底层,pandas.DataFrame不过是一个numpy.array。最简单、可能也是最快的方法是使用pandas.DataFrame.values

DataFrame.values

返回NDFrame的Numpy表示形式

注意事项

数据类型将会是低公共分母数据类型(隐式向上转型);也就是说,如果数据类型(即使是数值类型)混合在一起,那么将会选择适应所有类型的数据类型。如果你没有处理块,则要小心使用此函数。

例如:如果数据类型为float16和float32,数据类型将向上转型为float32。如果数据类型为int32和uint8,数据类型将向上转型为int32。根据numpy.find_common_type约定,混合int64和uint64将导致flot64数据类型。


1
关于数据类型的精确性正是我正在寻找的警告类型。 - 00__00__00
2
Pandas 0.24文档表示不再使用.values(),而是使用.array或.to_numpy()。请参见https://pandas.pydata.org/pandas-docs/stable/getting_started/basics.html,“过去,pandas建议使用Series.values或DataFrame.values从Series或DataFrame中提取数据。您仍然可以在旧代码库和在线上找到这些引用。未来,我们建议避免使用.values并改用.array或.to_numpy()。” - pauljohn32
@pauljohn32,你能把它变成一个答案吗?非常有用。 - 00__00__00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接