我有一个名为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时发生了什么?
由于
答案 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