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函数如何知道数据帧的构成?
答案 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