numpy函数如何在内部对pandas对象进行操作?

时间:2017-05-09 09:06:21

标签: python pandas numpy

Numpy函数,例如np.mean(),np.var()等,接受类似数组的参数,如np.array或list等。

但是传递大熊猫数据框也有效。这意味着pandas数据帧确实可以伪装成一个numpy数组,我发现它有点奇怪(尽管知道df的基础值确实是numpy数组)。

对于一个像数组一样的对象,我认为它应该可以使用整数索引进行切片,就像切割numpy数组一样。因此,例如df [1:3,2:3]应该可以工作,但这会导致错误。

因此,当数据帧进入函数内部时,可能会将转换转换为numpy数组。但如果是这样的话那么为什么np.mean(numpy_array)会导致与np.mean(df)不同的结果?

a = np.random.rand(4,2)
a
Out[13]: 
array([[ 0.86688862,  0.09682919],
   [ 0.49629578,  0.78263523],
   [ 0.83552411,  0.71907931],
   [ 0.95039642,  0.71795655]])

np.mean(a)
Out[14]: 0.68320065182041034

给出了与下面给出的结果不同的结果......

df = pd.DataFrame(data=a, index=range(np.shape(a)[0]), 
columns=range(np.shape(a)[1]))

df
Out[18]: 
      0         1
0  0.866889  0.096829
1  0.496296  0.782635
2  0.835524  0.719079
3  0.950396  0.717957

np.mean(df)
Out[21]: 
0    0.787276
1    0.579125
dtype: float64

前一个输出是单个数字,而后一个是列式方法。 numpy函数如何知道数据帧的构成?

1 个答案:

答案 0 :(得分:5)

如果您单步执行此操作:

--Call--
> d:\winpython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\fromnumeric.py(2796)mean()
-> def mean(a, axis=None, dtype=None, out=None, keepdims=False):
(Pdb) s
> d:\winpython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\fromnumeric.py(2877)mean()
-> if type(a) is not mu.ndarray:
(Pdb) s
> d:\winpython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\fromnumeric.py(2878)mean()
-> try:
(Pdb) s
> d:\winpython-64bit-3.4.3.5\python-3.4.3.amd64\lib\site-packages\numpy\core\fromnumeric.py(2879)mean()
-> mean = a.mean

您可以看到type不是ndarray,因此它会尝试拨打a.mean,在这种情况下会df.mean()

In [6]:

df.mean()
Out[6]:
0    0.572999
1    0.468268
dtype: float64

这就是输出不同的原因

上面重现的代码:

In [3]:
a = np.random.rand(4,2)
a

Out[3]:
array([[ 0.96750329,  0.67623187],
       [ 0.44025179,  0.97312747],
       [ 0.07330062,  0.18341157],
       [ 0.81094166,  0.04030253]])

In [4]:    
np.mean(a)

Out[4]:
0.52063384885403818

In [5]:    
df = pd.DataFrame(data=a, index=range(np.shape(a)[0]), 
columns=range(np.shape(a)[1]))
​
df

Out[5]:
          0         1
0  0.967503  0.676232
1  0.440252  0.973127
2  0.073301  0.183412
3  0.810942  0.040303

numpy输出:

In [7]:
np.mean(df)

Out[7]:
0    0.572999
1    0.468268
dtype: float64

如果您调用.values来返回np数组,则输出结果相同:

In [8]:
np.mean(df.values)

Out[8]:
0.52063384885403818