将这两件事视为对立是否正确?这对我来说是一个混乱的主要原因。
下面是一个示例,我在R和Python中找到数据框的列总和。请注意getMenuByLocationID(locationID) {
return this._http.get('/api/locations/menu', {params: {locationID: locationID}})
.map((response: Response) =>
_.reject(response.json(), {
_embedded: {
menu_categories: [ {
name: 'BEER'
} ]
}
}))
.toPromise()
.catch(this.handleError);
和MARGIN
的相反值。
在R中(使用axis
,即列边距):
MARGIN=2
在Python中(使用m <- matrix(1:6, nrow=2)
apply(m, MARGIN=2, mean)
[1] 1.5 3.5 5.5
,即行轴):
axis=0
答案 0 :(得分:3)
出现混淆是因为apply()
讨论了应用“覆盖”的维度,以及保留的维度。换句话说,当您apply()
超过行时,结果是一个向量,其长度是输入中的列数。 Pandas的文档(但不是R)强调了这种特殊的混淆:
axis : {0 or ‘index’, 1 or ‘columns’}
0 or ‘index’: apply function to each column
1 or ‘columns’: apply function to each row
如您所见,0
表示保留索引(行)维度,列维度已“应用于”(因此已消除)。
换句话说,对列的应用程序为axis=0
或MARGIN=2
,行上的应用程序为axis=1
或MARGIN=1
。 1
值似乎匹配,但这是假的:Python中的1
是第二维,因为Python是基于0的。
答案 1 :(得分:1)
您是正确的,R的apply
中的“边距”概念与numpy / panda的apply
函数中的“轴”概念相反。
假设我们将函数f
应用于二维数组arr
。函数f
采用向量输入。
R :MARGIN
参数指示在每次对arr
的调用中,将f
的哪个数组索引保持为 。因此,如果MARGIN=1
的每个调用f
适用于具有相同第一个数组索引的所有数据。这意味着该功能将应用于每行一次。
因此,f
依次应用于arr[1,]
,arr[2,]
,...,arr[n,]
,其中n
是{中的行数{1}}。
numpy / pandas :arr
参数指示在每次对axis
的调用中arr
的哪个数组索引将是 variable 。因此,如果f
,则对axis=0
的每次调用都会改变第一个数组索引以生成输入向量。这意味着该功能将应用于每个列一次。
因此,f
依次应用于f
,arr[:,0]
,...,arr[:,1]
,其中arr[:,m-1]
是{中的列数{1}}。
索引的差异(对于Python,从0开始,对于R,从1开始)可能会引起混淆,但这并不是差异的原因。我已经为以上每种语言使用了适当的语法。
替代解释
R问“该功能应沿哪个尺寸应用?”。因此,将行指示给R意味着您希望将函数应用于每一行。同时,numpy / pandas将其“轴”视为指示方向,例如图形的轴。因此,当您告诉Apply沿 row 轴工作时,它表示行轴是垂直的,并且它是垂直工作的,因此将函数应用于每个列。
答案 2 :(得分:0)
在Pandas和R中,“ axis”和“ margin”几乎是同义词:数据框的“ columns”轴或边距向下,而“ rows”轴或边距向右移动。
> Pandas和R的apply
实现对axis / margin关键字的作用不同,如下所示。
在R中,调用Rows <- 1; apply(df, Rows, sum)
表示
R:“'Row'是输入的形状。 f 的每次调用都作为参数传递给一行。”
Rows <- 1
Columns <- 2
df <- data.frame(c1 = 1:2, c2 = 3:4, c3 = 5:6, row.names=c('r1', 'r2'))
df
# c1 c2 c3
# r1 1 3 5
# r2 2 4 6
apply(df, Rows, sum)
# r1 9
# r2 12
在Python中,调用Rows = 0; df.apply(sum, axis=Rows)
意味着
Pandas:““行”是输出的形状。每次调用 f 都会将其作为参数传递给一列。”
import pandas as pd
Rows = 0
Columns = 1
df = pd.DataFrame(
{'c1': [1, 2], 'c2': [3, 4], 'c3': [5, 6]},
index=['r1', 'r2']
)
df
# c1 c2 c3
# r1 1 3 5
# r2 2 4 6
df.apply(sum, axis=Rows)
# c1 c2 c3
# 3 7 11