2014-03-03 35 views
116

这里是我的代码来生成一个数据帧:熊猫中的轴是什么意思?

import pandas as pd 
import numpy as np 

dff = pd.DataFrame(np.random.randn(1,2),columns=list('AB')) 

然后我得到的数据框:

+------------+---------+--------+ 
|   | A  | B  | 
+------------+---------+--------- 
|  0  | 0.626386| 1.52325| 
+------------+---------+--------+ 

当我键入条命令:

dff.mean(axis=1) 

我:

0 1.074821 
dtype: float64 

根据大熊猫的参考轴= 1个代表列,我预计该命令的结果是

A 0.626386 
B 1.523255 
dtype: float64 

因此,这里是我的问题:是什么轴大熊猫是什么意思?

回答

188

它指定轴沿手段进行计算。默认情况下,axis=0。当指定axis这与numpy.mean用法一致明确(在numpy.mean,通过默认轴==无,其计算所述扁平阵列上的平均值),其中axis=0沿着(即,指数熊猫)和axis=1沿着

+------------+---------+--------+ 
|   | A  | B  | 
+------------+---------+--------- 
|  0  | 0.626386| 1.52325|----axis=1-----> 
+------------+---------+--------+ 
      |   | 
      | axis=0 | 
      ↓   ↓ 
+62

通常轴= 0被认为是“按列”(并且axis = 1“row-wise”),我认为“沿着行”是令人困惑的。 (尼斯“图片虽然:)) –

+2

@AndyHayden是啊,但也许这两个是有点混淆,对那些谁第一次碰到这个;) – zhangxaochen

+6

这当然是真的,图片是**优秀** :) –

-7

这意味着它采取利用每一列基于均值,轴= 0会给你你怎么想,但轴= 1给出

(0.626386+1.52325)/2 
1.075 
+2

想一想,如果它像你要移除传递给该函数的轴。所以'dff.mean(axis = 1)'通过在它们上面聚合平均函数来移除'1'轴(列)。 – TomAugspurger

5

大熊猫设计师Wes McKinney曾经在金融数据方面进行过大量的工作。将列作为股票名称和指数考虑为每日价格。然后,您可以猜测与此财务数据有关的默认行为(即axis=0)。可以简单地认为axis=1是“另一个方向”。

例如,统计功能,如mean()sum()describe()count()所有默认列明智的,因为它更有意义,做他们每个股票。 sort_index(by=)也默认为列。 fillna(method='ffill')将填充列,因为它是相同的股票。 dropna()默认为行,因为您可能只想在当天放弃价格,而不是抛弃该股票的所有价格。

同样,方括号索引是指列,因为选择股票而不是选择一天更为常见。

+0

您的推理听起来很正确,但mean(),sum()和其他函数默认为(axis = 0),这是行方式而不是上文提到的。行式似乎表现得像我们期望的列式明智:)而这似乎是混乱。 – bincob

10

我理解的最简单方法是讨论是否计算每列(axis = 0)或每行(axis = 1)的统计量。如果你计算一个统计数据,说一个平均数,用axis = 0你会得到每一列的统计数据。因此,如果每个观察值都是一行,并且每个变量都在一列中,那么您将得到每个变量的平均值。如果您设置了axis = 1,那么您将计算每行的统计数据。在我们的例子中,你会得到所有变量的每个观察值的均值(也许你需要相关度量的平均值)。

axis = 0:通过柱=逐列=沿着行

axis = 1:由行=逐行=沿着列

12

axis指数组的维数,在pd.DataFrame的情况下s axis=0是指向下的维度,axis=1指向右边的维度。

例如:想象一下形状为(3,5,7)ndarray

a = np.ones((3,5,7)) 

a是3维ndarray,即它具有3轴( “轴” 是复数的 “轴” 的)。 a的配置看起来像3片面包,其中每片的尺寸为5×7。 a[0,:,:]将参考第0个切片,a[1,:,:]将指1-ST切片等

a.sum(axis=0)将适用sum()沿着a第0轴。您将添加所有切片并以一片切片形状(5,7)结束。

a.sum(axis=0)相当于

b = np.zeros((5,7)) 
for i in range(5): 
    for j in range(7): 
     b[i,j] += a[:,i,j].sum() 

ba.sum(axis=0)都将是这样的

array([[ 3., 3., 3., 3., 3., 3., 3.], 
     [ 3., 3., 3., 3., 3., 3., 3.], 
     [ 3., 3., 3., 3., 3., 3., 3.], 
     [ 3., 3., 3., 3., 3., 3., 3.], 
     [ 3., 3., 3., 3., 3., 3., 3.]]) 

pd.DataFrame,轴的工作方式相同numpy.array S:axis=0将适用sum()或任何其他减少函数为每列。

N.B.在@ zhangxaochen的回答中,我发现短语“沿着行”和“沿着列”有些混淆。 axis=0应该指“沿着每一列”,并且沿着每一行“axis=1”。

2

从编程角度看,轴是形状元组中的位置。以下是一个示例:

import numpy as np 

a=np.arange(120).reshape(2,3,4,5) 

a.shape 
Out[3]: (2, 3, 4, 5) 

np.sum(a,axis=0).shape 
Out[4]: (3, 4, 5) 

np.sum(a,axis=1).shape 
Out[5]: (2, 4, 5) 

np.sum(a,axis=2).shape 
Out[6]: (2, 3, 5) 

np.sum(a,axis=3).shape 
Out[7]: (2, 3, 4) 

轴上的平均值将导致该维度被删除。

参照原始问题,dff形状是(1,2)。使用轴= 1将形状更改为(1,)。

5

这些答案确实有助于解释这一点,但对于非程序员(即像我这样第一次在数据科学课程中学习Python的人)来说,它仍然不是非常直观。我仍然发现对行和列使用术语“沿”或“对于每个”是混淆的。

什么更有意义,我是这样说的:

  • 轴0将在每列
  • 轴1将在每个行作用于所有列作用于所有行

因此,轴0上的平均值将是每列中所有行的平均值,轴1上的平均值将是每行中所有列的平均值。

最终这是说@ zhangxaochen和@Michael相同的东西,但以一种更容易让我内化的方式。

1

轴= 0意味着上向下 轴线= 1种手段左至右

sums[key] = lang_sets[key].iloc[:,1:].sum(axis=0) 

鉴于例如在塔采取所有数据的总和==键。