熊猫中的轴是什么意思?

jer*_*jtu 243 python numpy dataframe pandas

这是我生成数据帧的代码:

import pandas as pd
import numpy as np

dff = pd.DataFrame(np.random.randn(1,2),columns=list('AB'))
Run Code Online (Sandbox Code Playgroud)

然后我得到了数据帧:

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|
+------------+---------+--------+
Run Code Online (Sandbox Code Playgroud)

当我输入命令时:

dff.mean(axis=1)
Run Code Online (Sandbox Code Playgroud)

我有 :

0    1.074821
dtype: float64
Run Code Online (Sandbox Code Playgroud)

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

A    0.626386
B    1.523255
dtype: float64
Run Code Online (Sandbox Code Playgroud)

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

zha*_*hen 352

它指定轴沿其的装置被计算的.默认情况下axis=0.这是与相一致numpy.mean时使用axis指定明确地(在numpy.mean,轴==默认无,其计算所述扁平阵列上的平均值),其中axis=0沿所述(即,索引在大熊猫),和axis=1沿所述.为了更加清晰,可以选择指定axis='index'(而不是axis=0)或axis='columns'(而不是axis=1).

+------------+---------+--------+
|            |  A      |  B     |
+------------+---------+---------
|      0     | 0.626386| 1.52325|----axis=1----->
+------------+---------+--------+
             |         |
             | axis=0  |
             ?         ?
Run Code Online (Sandbox Code Playgroud)

  • 通常,轴= 0被称为"逐列"(并且轴= 1"逐行"),我认为"沿着行"是令人困惑的.(不错的"pic"虽然:)) (132认同)
  • 此外,'axis = 0`表示沿行聚合而`轴= 1`的原因表示沿列聚合是因为您索引数据帧的方式.在`df.iloc [row,column]`中,`row`在索引位置0,`column`在索引位置1. [Numpy](http://docs.scipy.org/doc/numpy/reference/ arrays.ndarray.html #computing)将此概括为N维度,这是考虑聚合崩溃的轴开始比"行式"或"列式"更有意义的地方. (35认同)
  • @AndyHayden是的,但也许两者都有点令人困惑,对于第一次碰到这个的人;) (7认同)
  • 我仍然感到困惑.如果我执行`df.drop("A",axis = 1)`那么A __column__将被删除.它不是"沿着行",也不是"沿行",而是放下A列. (7认同)
  • @ytu `axis=0` 表示每一行都是一个批量,我们只能操作 DataFrame 行间而不是行内。`axis=1` 表示每列作为一个块,我们只能操作 DataFrame 列间而不是列内。因此,如果您使用 `df.drop("A",axis = 1)`,它将删除一整列。 (7认同)
  • axis = 0(向下),axis = 1(向右)。要应用任何向下操作,请使用 axis = 0; 要在右侧应用任何操作,请使用 axis =1。这是我记忆和避免混乱的技巧。 (3认同)
  • 我认为“沿着”应该用“跨越”来代替。对我来说,沿着某事物(例如道路)走意味着留在上面,但是当 axis=0 时,我们在计算平均值时不会停留在同一行;相反,我们遍历一列中的所有行。 (2认同)

Ken*_*ace 81

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

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

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

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

最终,这与@ zhangxaochen和@Michael的说法相同,但在某种程度上我更容易内化.

  • 这是比公认的最佳答案。 (3认同)

anu*_*anu 49

让想象(永远记住), 在此输入图像描述

在熊猫:

  1. axis = 0表示沿"索引".这是一个按行进行的操作.

假设,要对dataframe1和dataframe2执行concat()操作,我们将获取dataframe1并从dataframe1取出第一行并放入新的DF,然后我们从dataframe1取出另一行并放入新的DF,我们重复此过程直到我们到达dataframe1的底部.然后,我们对dataframe2执行相同的过程.

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

例如,在桌子或地板上做一堆书

  1. axis = 1表示沿"列".这是一个按列操作.

假设,为了对dataframe1和dataframe2执行concat()操作,我们将取出dataframe1的第一个完整列(又名第一个系列)并放入新的DF,然后我们取出第二列dataframe1并保持相邻(侧面) ),我们必须重复此操作,直到所有列都完成.然后,我们在dataframe2上重复相同的过程.基本上, 堆叠dataframe2横向.

例如,在书架上安排书籍.

  • 同意@rocksNwaves,我也不相信这是一个有用的可视化。将其视为“axis='index'/'columns'”而不是“axis=0/1”可能更有意义。`axis='index'` 表示您正在沿着索引_垂直向下_移动。`axis='columns'` 表示您正在沿着列_水平向右_移动。正确地看待你的书架可视化是违反直觉的。 (5认同)
  • @anu——手脏了?我们不需要用重复的问题来搞乱。我相信这一页上的一个或多个答案可以得到澄清,以减少这种混乱。如果可以的话我会自己做,但现在我只知道如何使用它们。我确实知道使用哪个轴来获取我想要的数据。然而,对于为什么mean()和drop()感觉它们影响相反的轴仍然令人困惑。 (4认同)
  • 我认为这个答案是正确的.你需要想象它.axis = 0(或轴='rows'是水平轴.轴= 1(或轴='列')是垂直轴.更进一步,如果你使用pandas方法drop,删除列或行,如果你指定axis = 1你将删除列.如果指定axis = 0,你将从数据集中删除行.所以如果我们在变量df中有一些pandas数据帧:df.drop(0,axis = 0)将删除整个第一行数据集df.drop('等级',轴= 1)将从数据集中删除列'成绩'希望这再澄清一点...... (3认同)
  • @Roboblob——仍然令人困惑。df.drop(n, axis=1) 作用于列。为什么 df.mean(axis=1) 不对列执行操作? (3认同)
  • 恐怕这个答案非常令人困惑。您谈到对行进行操作时 axis=0 但您在列中绘制了红色箭头。您谈论 axis=1 作用于列,但您却绘制了穿过行的箭头。不管是谁想出了这个系统,都没有经过深思熟虑。 (3认同)

小智 29

axis指的是数组的维数,在pd.DataFrames 的情况下axis=0是指向下的维度和axis=1指向右的维度.

示例:想一下ndarray有形状(3,5,7).

a = np.ones((3,5,7))
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

b并且a.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.]])
Run Code Online (Sandbox Code Playgroud)

在a中pd.DataFrame,轴的工作方式与numpy.arrays 相同:axis=0将应用sum()或每列的任何其他缩减功能.

注意在@ zhangxaochen的回答中,我发现"沿着行"和"沿着列"这两个短语略显混乱.axis=0应该参考"沿着每一列"和axis=1"沿着每一行".

  • 这是一个比公认的更好的答案 - 因为正如 Safak 提到的那样,那里使用的短语措辞不佳,导致更多的混乱。 (2认同)

Mic*_*ael 21

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

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

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

  • 我认为“沿着”应该用“跨越”来代替。对我来说,沿着某事物(例如道路)走意味着留在上面,但是当使用“axis=0”时,我们在计算平均值时不会停留在所说的行上;相反,我们遍历一列中的所有行。 (5认同)

lea*_*ode 12

我曾经也对此感到困惑,但这就是我的记忆。

它指定将更改或将执行操作的数据帧的维度。

让我们通过一个例子来理解这一点。我们有一个数据框df,其形状为 (5, 10),这意味着它有 5 行和 10 列。

现在,当我们df.mean(axis=1)这样做时,意味着维度 1 将被更改,这意味着它将具有相同的行数但不同的列数。因此,得到的结果将具有 (5, 1) 的形状。

类似地,如果我们df.mean(axis=0)这样做,则意味着维度 0 将被更改,即行数将更改,但列数将保持不变,因此结果将是形状 (1, 10)。

尝试将其与问题中提供的示例联系起来。


Mar*_*k09 10

编程视图中的轴是形状元组中的位置.这是一个例子:

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)
Run Code Online (Sandbox Code Playgroud)

轴上的平均值将导致该尺寸被移除.

参考原始问题,dff形状是(1,2).使用axis = 1会将形状更改为(1,).


Mar*_*anD 10

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

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

这个答案背后的主要思想是,为了避免混淆,我们选择一个数字或一个名称来指定特定的轴,以更清晰、直观和描述性更强的为准。

Pandas 基于 NumPy,后者基于数学,特别是基于 n 维矩阵。这是 3 维空间中数学中轴名称的常用图像:

在此处输入图片说明 此图仅用于记忆轴的序数

  • 0 对于 x 轴,
  • 1 对于 y 轴,和
  • 2 对于 z 轴。

z轴是只对面板; 对于数据框,我们将把我们的兴趣限制在带有x 轴 ( , 垂直)y 轴 ( , 水平)的绿色二维基本平面01

在此处输入图片说明 这都是数字作为axis=参数的潜在值。

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

现在,我的建议是:

  1. 如果你想计算一个累积值,你可以从沿轴 0(或沿轴 1)的值计算它——使用axis=0(或axis=1)。

    同样,如果要重新排列值,请使用轴的轴号沿其定位的数据进行重新排列(例如用于排序)。

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

  • 这是最好的答案,应该被操作员标记为正确答案! (2认同)

nos*_*nos 8

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

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

类似地,方括号索引指的是列,因为选择股票而不是选择一天更常见.

  • 您的推理听起来不错,但 mean()、sum() 和其他函数默认为 (axis = 0),这是按行进行的,而不是如上所述。行式似乎表现得像我们期望的列式 :) 而这似乎是混乱。 (3认同)

Sum*_*rel 6

让我们看一下Wiki中的表格。这是国际货币基金组织对2010年至2019年前十个国家GDP的估计。 在此处输入图片说明

1.第1轴将对所有列的每一行起作用
如果您想计算十年(2010-2019年)中每个国家的平均(平均)GDP,则需要做df.mean(axis=1)。例如,如果您要计算2010年至2019年美国的平均GDP,df.loc['United States','2010':'2019'].mean(axis=1)

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

请注意:上面的代码仅在将“国家(或从属地区)”列设置为“索引”后才能使用set_index方法。


yos*_*e_k 6

记住轴 1(列)与轴 0(行)的简单方法之一是您期望的输出。

  • 如果您希望使用axis='columns' 的每一行都有一个输出,
  • 另一方面,如果您想要为每一列输出,您可以使用axis='rows'。


eli*_*liu 5

我相信,正确的答案应该是“很复杂

[1] 术语“轴”本身在不同的人中会产生不同的心理图像,
比如说 y 轴,它应该会让人产生垂直物体的图像。然而,现在想到一条垂直线x=0。它也是垂直线,但它是通过x 轴上的值来寻址的。0

同样,当我们说axis='index'(意思axis=0)时,我们是在说索引所在的“垂直”方向吗?或者由索引值寻址的一系列数据?熊猫往往指的是第一个意思,垂直方向。

[2] Pandas 本身也不是 100% 一致,观察以下案例,它们几乎有相同的共同主题:

# [1] piling dfs
pd.concat([df0, df1], axis='index') 
    # adding dfs on top of each other vertically like pilling up a column, 
    # but, we will use the word 'index'

# [2] for every column in df: operate on it
df.apply(foo, axis='index')     # apply func foo to one column at a time
df.mean('A', axis='index')      # apply "mean()" to one column at a time
a_boolean_df.all(axis='index')  # check if each column contains only bool "True"
    # apply an operation to a vertical slice of data, ie. a column, 
    # then apply the same operation to the next column on the right 
    # then to the right again... until the last column
    # but, we will use the word 'index'

# [3] delete a column or row of data
df.drop(axis='index', ...)
df.dropna(axis='index', ...)
    # this time, we are droping an index/row, a horizontal slice of data.
    # so OBVIOUSLY we will use the word 'index'

# [4] when you iterate thru a df naturally, what would show up first? a row or a column?
for x in df:
    # x == a column's name

# [5] drop duplicate
df.drop_duplicates(subset=['mycolumn0', 'mycolumn1']...)
    # thank God we don't need to deal with the "axis" bs in this
Run Code Online (Sandbox Code Playgroud)