为什么dataframe.values非常慢

时间:2014-03-04 02:38:38

标签: pandas

我有一个名为df的pandas数据帧。当我执行以下操作时:

  

A = df.values   然后当我检查:   A是df.values   它返回False。

即使我检查type(A)type(df.values),也会将该类型重新运行为numpy.ndarray

另外,我的df混合了字符串和数字数据。通话A[10,1]明显快于通话df.values[10,1

我想知道当我打电话给df.values时发生了什么?

由于

1 个答案:

答案 0 :(得分:3)

对于混合类型调用.values的DataFrame,将多个块(对于每个dtype)转换为一个包含无所不包的dtype的numpy数组。对于大帧,此转换可能会很慢。

In [11]: pd.DataFrame([[1, 2.]]).values
Out[11]: array([[ 1.,  2.]])

In [12]: pd.DataFrame([[1, 2., 'a']]).values
Out[12]: array([[1, 2.0, 'a']], dtype=object)

时间安排的例子:

In [21]: df = pd.DataFrame(np.random.randn(10000))

In [22]: %timeit df.values  # no conversion
100000 loops, best of 3: 3.72 µs per loop

In [23]: df[1] = 'a'  # add column of object dtype

In [24]: %timeit df.values  # conversion to object dtype
1000 loops, best of 3: 681 µs per loop

您可以通过._data属性查看数据在BlockManager中的存储方式。

要回答这个问题,因为每次返回numpy数组具有不同的id /内存地址时,此值属性都是计算,因此A is df.values为False。你需要使用像numpy的array_equal:

这样的东西
In [31]: df.values is df.values
Out[31]: False

In [32]: np.array_equal(df.values, df.values)
Out[32]: True