熊猫中的轴是什么意思?

时间:2014-03-03 14:41:04

标签: python pandas numpy dataframe

以下是我生成数据框的代码:

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

根据pandas的引用,axis = 1代表列,我希望命令的结果是

A    0.626386
B    1.523255
dtype: float64

所以这是我的问题:熊猫的轴是什么意思?

22 个答案:

答案 0 :(得分:298)

它指定轴>计算平均值。默认情况下为axis=0。这与numpy.meanaxis明确指定时的使用情况一致numpy.mean,默认情况下,轴==无,这会计算平展的平均值数组),其中中的axis=0(即pandas中的 index )和列中的axis=1 。为了更加清晰,可以选择指定axis='index'(而不是axis=0)或axis='columns'(而不是axis=1)。

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

答案 1 :(得分:57)

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

对我来说更有意义的是这样说:

  • Axis 0将作用于每个COLUMN中的所有ROWS
  • Axis 1将作用于每个ROW中的所有COLUMNS

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

最终,这与@ zhangxaochen和@Michael的说法相同,但是我更容易内化。

答案 2 :(得分:31)

让我们想象(你会永远记住), enter image description here

在熊猫:

  1. axis = 0表示沿“索引”。这是行式操作
  2. 假设在dataframe1&上执行concat()操作。 dataframe2, 我们将采用dataframe1&从dataframe1取出第一行并放入新的DF,然后我们从dataframe1取出另一行并放入新的DF,我们重复这个过程,直到我们到达dataframe1的底部。然后,我们对dataframe2执行相同的过程。

    基本上,将dataframe2堆叠在dataframe1之上,反之亦然。

    例如在桌子或地板上制作一堆书

    1. axis = 1表示沿“列”。这是列式操作。
    2. 假设在dataframe1&上执行concat()操作。 dataframe2, 我们将拿出第一个完整列(又名第一系列)dataframe1并放入新DF,然后我们取出第二列dataframe1并保持与它相邻(侧面),我们必须重复此操作,直到完成所有列。然后,我们在dataframe2上重复相同的过程。 基本上, 横向堆叠dataframe2。

      例如在书架上安排书籍。

        

      更多的是,因为与矩阵相比,数组是更好的表示来表示嵌套的n维结构!因此,当您推广到多个维度时,下面可以帮助您更多地可视化轴如何发挥重要作用。此外,您实际上可以打印/写入/绘制/可视化任何n-dim数组,但是在超过3维的纸张上,无法以矩阵表示(3-dim)书写或可视化相同的数组。

      enter image description here

答案 3 :(得分:26)

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

示例:想一下形状为(3,5,7)的{​​{1}}。

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

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

a.sum(axis=0)将沿sum()的第0轴应用a。您将添加所有切片,最后得到一片形状(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中的相同:axis=0将为每列应用sum()或任何其他缩减功能。

N.B。在@ zhangxaochen的回答中,我发现“沿着行”和“沿着列”这两个短语略显混乱。 axis=0应该引用“沿着每一列”,并且axis=1“沿着每一行”。

答案 4 :(得分:21)

让我理解的最简单方法是讨论您是为每列(axis = 0)还是每行(axis = 1)计算统计数据。如果您使用axis = 0计算统计数据(比如均值),您将获得每列的统计数据。因此,如果每个观察都是一行,并且每个变量都在一列中,您将获得每个变量的平均值。如果您设置axis = 1,那么您将计算每行的统计信息。在我们的示例中,您将获得所有变量中每个观察值的均值(可能您需要相关度量的平均值)。

axis = 0:by column = column-wise =沿着行

axis = 1:by row = row-wise =沿列

答案 5 :(得分:9)

考虑到编程的轴是形状元组中的位置。这是一个例子:

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)。使用axis = 1会将形状更改为(1,)。

答案 6 :(得分:8)

熊猫的设计师Wes McKinney过去常常专注于财务数据。将列视为股票名称和索引作为每日价格。然后,您可以猜测此财务数据的默认行为(即axis=0)。 axis=1可以被简单地视为另一个方向'。

例如,统计函数(例如mean()sum()describe()count()都默认为列式,因为执行它们更有意义每个股票。 sort_index(by=)也默认为列。 fillna(method='ffill')将填充列,因为它是相同的库存。 dropna()默认为行,因为您可能只想丢弃当天的价格而不是丢弃该股票的所有价格。

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

答案 7 :(得分:2)

让我们看一下Wiki中的表格。这是国际货币基金组织对2010年至2019年前十个国家GDP的估计。 enter image description here

1。第1轴将在所有列的每一行上起作用
如果要计算十年(2010-2019年)中每个国家的平均(平均)GDP,则需要做{{1 }}。例如,如果您要计算2010年至2019年美国的平均GDP,def numbers_to_strings(a1): switcher = { 1: push, 2: pop, 3: display, 4: quit } return switcher.get(a1, "nothing")() # get the function object, then evalutate

2。轴0将对所有行中的每一列起作用
如果我想计算所有国家/地区每个年份的平均(平均)GDP,则需要执行df.mean(axis=1)。例如,如果您要计算美国,中国,日本,德国和印度的2015年平均GDP,df.loc['United States','2010':'2019'].mean(axis=1)

注意:以上代码仅在使用df.mean(axis=0)方法将“国家(或从属地区)”列设置为索引后才有效。

答案 8 :(得分:1)

轴= 0表示向上到向下 axis = 1表示从左到右

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

给出的例子是在列==键中获取所有数据的总和。

答案 9 :(得分:1)

这是基于@Safak的答案。 理解pandas / numpy中轴的最好方法是创建一个3d数组,并检查3个不同轴上sum函数的结果。

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

a将是:

    array([[[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]],

   [[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]],

   [[1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.],
    [1., 1., 1., 1., 1., 1., 1.]]])

现在检查沿每个轴的数组元素的总和:

 x0 = np.sum(a,axis=0)
 x1 = np.sum(a,axis=1)
 x2 = np.sum(a,axis=2)

将为您提供以下结果:

   x0 :
   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.]])

   x1 : 
   array([[5., 5., 5., 5., 5., 5., 5.],
   [5., 5., 5., 5., 5., 5., 5.],
   [5., 5., 5., 5., 5., 5., 5.]])

  x2 :
   array([[7., 7., 7., 7., 7.],
        [7., 7., 7., 7., 7.],
        [7., 7., 7., 7., 7.]])

答案 10 :(得分:1)

enter image description here

enter image description here

axis = 1,它将明智地求和行,keepdims = True将保持二维尺寸。 希望对您有帮助。

答案 11 :(得分:1)

正确使用axis=的问题在于它可用于两种主要的不同情况:

  1. 用于计算累积值重新排列(例如,排序)数据。
  2. 用于操作(与“ 实体” “玩”)(例如,数据帧)。

此答案的主要思想是为了避免混淆,我们选择 number name 来指定特定轴,更加清晰,直观和描述性。

Pandas基于NumPy,它基于数学,尤其是基于n维矩阵。这是3维空间中数学中轴名称的常用图像:

enter image description here 这张图片仅用于记忆轴的序数

  • 0用于x轴,
  • 1(用于y轴)和
  • 2(用于z轴)。

z轴仅用于面板;对于数据帧,我们会将兴趣限制在带有 x轴(0,垂直)的绿色,二维基本平面 y轴(1,水平)。

enter image description here 这些都是数字作为axis=参数的潜在值。

轴的名称'index'(您可以使用别名'rows')和'columns',对于此解释并不重要这些名称与(轴的)序数之间的关系,因为每个人都知道“行” “列” 这两个词的含义(而每个人在这里-我想-知道熊猫中“索引” 的意思。

现在,我的建议:

  1. 如果要计算累加值,则可以根据位于沿轴0 (或沿沿轴1 )的值进行计算>)-使用axis=0(或axis=1)。

    类似地,如果您要重新排列值,请使用轴的轴号以及是要重新排列的数据(例如用于排序)。

  2. 如果要操作(例如连接实体(例如数据框),请使用axis='index'(同义词:axis='rows')或axis='columns'指定结果更改-索引 )或
    (对于串联,您将分别获得更长的索引(=更多的行)更多的列。)

    < / li>

答案 12 :(得分:0)

例如,如果您使用 df.shape,那么您将获得一个包含数据框中行数和列数的元组作为输出。

In [10]: movies_df.shape
Out[10]: (1000, 11)

在上面的示例中,电影数据框中有 1000 行和 11 列,其中在元组的索引 0 位置和索引 1 位置中提到了“行”和“列”。因此,'axis=1' 表示列,'axis=0' 表示行。

信用:Github

答案 13 :(得分:0)

这里的许多答案对我有很大帮助!

如果您对Python中的axis和R中的MARGIN的不同行为感到困惑(例如在apply函数中),您可能会发现我写的一篇博客文章兴趣:https://accio.github.io/programming/2020/05/19/numpy-pandas-axis.html

本质上:

  • 有趣的是,与二维数组相比,使用三维数组更容易理解它们的行为。
  • 在Python软件包numpypandas中,sum的axis参数实际上指定numpy,以计算可以以array [0,0,...形式获取的所有值的均值。 ,i,...,0],在其中迭代所有可能的值。在i的位置固定的情况下重复此过程,其他维度的索引则一个接一个地变化(从最右边的元素开始)。结果是一个n维数组。
  • 在R中,MARGINS参数使apply函数计算可以以array [,...,i,...,]的形式获取的所有值的平均值,其中i遍历所有可能的值。迭代完所有i值后,不再重复该过程。因此,结果是一个简单的向量。

答案 14 :(得分:0)

我也一直在试图找出最后一个小时的轴。以上所有答案中的语言以及文档都根本没有帮助。

要回答我现在所理解的问题,在Pandas中,axis = 1或0表示在应用该函数时要保持哪个轴头

注意:当我说标题时,我指的是索引名称

扩展您的示例:

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      X     | 0.626386| 1.52325|
+------------+---------+--------+
|      Y     | 0.626386| 1.52325|
+------------+---------+--------+

对于axis = 1 = columns:我们保持列标题不变,并通过更改数据应用均值函数。 为了演示,我们将列标题保持不变:

+------------+---------+--------+
|            |  A      |  B     |

现在我们填充一组A和B值,然后找到均值

|            | 0.626386| 1.52325|  

然后我们填充下一组A和B值并找到均值

|            | 0.626386| 1.52325|

类似地,对于axis = rows,我们保持行标题不变,并不断更改数据: 为了演示,请首先修复行标题:

+------------+
|      X     |
+------------+
|      Y     |
+------------+

现在填充第一组X和Y值,然后找到均值

+------------+---------+
|      X     | 0.626386
+------------+---------+
|      Y     | 0.626386
+------------+---------+

然后填充下一组X和Y值,然后找到均值:

+------------+---------+
|      X     | 1.52325 |
+------------+---------+
|      Y     | 1.52325 |
+------------+---------+

总而言之,

当axis = columns时,您将固定列标题并更改数据,这些数据将来自不同的行。

当axis = rows时,您可以修复行标题并更改数据,这些数据将来自不同的列。

答案 15 :(得分:0)

由于人们可能会以完全错误的方式解释它们,因此我将明确避免使用“按行”或“沿列”。

首先是类比。直观地,您会期望pandas.DataFrame.drop(axis='column')从N列中删除一列,并为您提供(N-1)列。因此,您现在无需关注行(并从英语词典中删除单词“ row”。)反之亦然,drop(axis='row')适用于行。

以同样的方式,sum(axis='column')在多列上工作,并为您提供1列。同样,sum(axis='row')排成1行。这与最简单的定义形式一致,将数字列表减少为一个数字。

通常,使用axis=column,您可以看到列,处理列并获取列。忘记行。

使用axis=row,可以更改视角并处理行。

0和1只是'row'和'column'的别名。这是矩阵索引的惯例。

答案 16 :(得分:0)

记住轴1(列)和轴0(行)的简单方法之一就是您期望的输出。如果您希望每行的输出都使用axis ='columns',另一方面,如果您希望每行的输出都使用axis ='rows'。

答案 17 :(得分:0)

我认为还有另一种理解方式。

对于np.array,如果要消除列,则使用axis = 1;如果要消除行,则使用轴= 0。

np.mean(np.array(np.ones(shape=(3,5,10))),axis = 0).shape # (5,10)
np.mean(np.array(np.ones(shape=(3,5,10))),axis = 1).shape # (3,10)
np.mean(np.array(np.ones(shape=(3,5,10))),axis = (0,1)).shape # (10,)

对于pandas对象,axis = 0代表行操作,axis = 1代表列操作。这与numpy的定义不同,我们可以检查numpy.docpandas.doc

中的定义

答案 18 :(得分:0)

我这样理解:

说,如果您的操作需要在数据框中从从左向右/从右向左遍历,则显然是在合并列,即。您正在各种列上进行操作。 这是轴= 1

示例

df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['A', 'B', 'C', 'D'])
print(df)
   A  B   C   D
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11 

df.mean(axis=1)

0    1.5
1    5.5
2    9.5
dtype: float64

df.drop(['A','B'],axis=1,inplace=True)

    C   D
0   2   3
1   6   7
2  10  11
  

要注意的是我们正在对列进行操作

类似地,如果您的操作需要在数据框中从顶部到底部/从底部到顶部遍历,则您正在合并行。这是轴= 0

答案 19 :(得分:0)

我是熊猫的新手。但这就是我理解熊猫轴的方式:


恒定 变化 方向


0列向下排|


向右1行列->


因此,要计算列的均值,该特定列应为恒定,但其下的行可以更改(变化),因此轴= 0。

类似地,要计算一行的均值,该特定行是恒定,但它可以遍历不同的列(不同),轴= 1。

答案 20 :(得分:0)

我的想法:Axis = n,其中n = 0,1等等意味着矩阵沿着该轴折叠(折叠)。因此,在2D矩阵中,当您沿0(行)折叠时,您实际上一次只能在一列上操作。类似地,对于高阶矩阵。

这与矩阵中维度的常规引用不同,其中0 - >行和1 - &gt;柱。类似地,对于N维数组中的其他维度。

答案 21 :(得分:-3)

阵列设计时所谓的轴= 0,行垂直位于轴= 1,列位于水平位置。轴指的是数组的维数。 Illustration