熊猫/ numpy的轴是否与R&#39的MARGIN相反?

时间:2017-11-12 22:10:57

标签: python r pandas numpy

将这两件事视为对立是否正确?这对我来说是一个混乱的主要原因。

下面是一个示例,我在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

3 个答案:

答案 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=0MARGIN=2,行上的应用程序为axis=1MARGIN=11值似乎匹配,但这是假的: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依次应用于farr[:,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