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)
Ken*_*ace 81
这些答案确实有助于解释这一点,但对于非程序员(即像我这样的人,在数据科学课程的背景下第一次学习Python),它仍然不是非常直观.我仍然发现使用术语"沿"或"对于每个"wrt行和列是令人困惑的.
对我来说更有意义的是这样说:
因此,轴0上的平均值将是每列中所有行的平均值,轴1上的平均值将是每行中所有列的平均值.
最终,这与@ zhangxaochen和@Michael的说法相同,但在某种程度上我更容易内化.
anu*_*anu 49
在熊猫:
假设,要对dataframe1和dataframe2执行concat()操作,我们将获取dataframe1并从dataframe1取出第一行并放入新的DF,然后我们从dataframe1取出另一行并放入新的DF,我们重复此过程直到我们到达dataframe1的底部.然后,我们对dataframe2执行相同的过程.
基本上,将dataframe2堆叠在dataframe1之上,反之亦然.
例如,在桌子或地板上做一堆书
假设,为了对dataframe1和dataframe2执行concat()操作,我们将取出dataframe1的第一个完整列(又名第一个系列)并放入新的DF,然后我们取出第二列dataframe1并保持相邻(侧面) ),我们必须重复此操作,直到所有列都完成.然后,我们在dataframe2上重复相同的过程.基本上, 堆叠dataframe2横向.
例如,在书架上安排书籍.
小智 29
axis
指的是数组的维数,在pd.DataFrame
s 的情况下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.array
s 相同:axis=0
将应用sum()
或每列的任何其他缩减功能.
注意在@ zhangxaochen的回答中,我发现"沿着行"和"沿着列"这两个短语略显混乱.axis=0
应该参考"沿着每一列"和axis=1
"沿着每一行".
Mic*_*ael 21
我理解的最简单方法是讨论是否要计算每列(axis = 0
)或每行(axis = 1
)的统计量.如果你计算一个统计量,说一个均值,axis = 0
你将得到每列的统计量.因此,如果每个观察都是一行,并且每个变量都在一列中,您将获得每个变量的平均值.如果您设置,axis = 1
那么您将计算每行的统计数据.在我们的示例中,您将获得所有变量中每个观察值的均值(可能您需要相关度量的平均值).
axis = 0
:by column = column-wise =沿着行
axis = 1
:by row = row-wise =沿列
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=
正确使用的问题在于它在两种主要不同情况下的使用:
这个答案背后的主要思想是,为了避免混淆,我们选择一个数字或一个名称来指定特定的轴,以更清晰、直观和描述性更强的为准。
Pandas 基于 NumPy,后者基于数学,特别是基于 n 维矩阵。这是 3 维空间中数学中轴名称的常用图像:
0
对于 x 轴,1
对于 y 轴,和2
对于 z 轴。该z轴是只对面板; 对于数据框,我们将把我们的兴趣限制在带有x 轴 ( , 垂直)和y 轴 ( , 水平)的绿色二维基本平面上。0
1
轴的名称是'index'
(您可以使用别名'rows'
)和'columns'
,对于这个解释,这些名称和序数(轴的)之间的关系并不重要,因为每个人都知道“行”和“列”这两个词的意思(这里的每个人——我想——都知道熊猫中的“索引”这个词是什么意思)。
现在,我的建议是:
如果你想计算一个累积值,你可以从沿轴 0(或沿轴 1)的值计算它——使用axis=0
(或axis=1
)。
同样,如果要重新排列值,请使用轴的轴号,沿其定位的数据进行重新排列(例如用于排序)。
如果您想操作(例如连接)实体(例如数据帧)——分别使用axis='index'
(同义词:)axis='rows'
或axis='columns'
指定结果变化——索引(行)或列。
(对于连接,您将分别获得更长的索引(= 更多行)或更多列。)
熊猫的设计师Wes McKinney过去常常专注于财务数据.将列视为股票名称和索引作为每日价格.然后,您可以猜测axis=0
此财务数据的默认行为(即).axis=1
可以简单地认为是"另一个方向".
例如,统计功能,如mean()
,sum()
,describe()
,count()
都默认为列明智的,因为它更有意义,做他们每个股票.sort_index(by=)
也默认为列.fillna(method='ffill')
将填充列,因为它是相同的股票.dropna()
默认为行,因为您可能只想丢弃当天的价格而不是丢弃该股票的所有价格.
类似地,方括号索引指的是列,因为选择股票而不是选择一天更常见.
让我们看一下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
方法。
记住轴 1(列)与轴 0(行)的简单方法之一是您期望的输出。
我相信,正确的答案应该是“很复杂”
[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)
归档时间: |
|
查看次数: |
191567 次 |
最近记录: |