2017-11-12 3 views
1

이 두 가지가 반대라고 생각하는 것이 맞습니까? 이것은 나를 위해 혼란의 주요 원천이되었습니다.pandas/numpy의 축은 R의 MARGIN과 반대입니까?

다음은 R과 Python의 데이터 프레임의 열 합계를 찾는 예제입니다. MARGINaxis의 반대 값을 확인하십시오.

(열 마진 즉 MARGIN=2 사용) R에

:

파이썬
m <- matrix(1:6, nrow=2) 
apply(m, MARGIN=2, mean) 
[1] 1.5 3.5 5.5 

(행 축, 즉 axis=0 사용) : R이 "열이므로

In [25]: m = pd.DataFrame(np.array([[1, 3, 5], [2, 4, 6]])) 
In [26]: m.apply(np.mean, axis=0) 
Out[26]: 
0 1.5 
1 3.5 
2 5.5 
dtype: float64 

답변

3

이 일어난다 (Fortran과 같은) "주요"언어 인 반면, NumPy와 팬더는 "행과 같은"(C와 같은) 주요 언어입니다. NumPy에 order='F'을 설정하여 기본 저장소를 column-major로 변경하더라도 API는 여전히 본질적으로 행 메이저입니다.

NumPy와 Pandas에서 첫 번째 측정 기준 (0)은 행을 참조하는 반면 R의 첫 번째 측정 기준 (1은 R 기준)은 열을 나타냅니다.

위의 설명에서 나는 어느 차원이 먼저 왔는지 설명했습니다. apply()은 적용 범위가 "끝났습니다"및 이 유지되는 인 두 차원 모두에 대해 말하기 때문에 혼란이 또한 발생합니다. 즉, 행 수가 apply() 일 때 결과는 길이가 입력의 열 수인 벡터입니다. 이 특정 혼란은 팬더 '문서에 의해 강조 (그러나 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이 0 기반이기 때문에 Python에서 1이 두 번째 차원입니다.

+1

어원 및 니모닉에 감사드립니다. 불행하게도, R의 첫 번째 차원은 여전히 ​​행을 참조합니다 ('help (apply)'에서 : 행렬 1은 행을 나타내고, 2는 행을 나타냄 **). 이 차이를 이해하거나 기억하는 또 다른 방법이 있습니까? – Heisenberg

+1

@ Heisenberg 나는 차이가 행을 가로 지르는 것과 비교하여 각 행에 대해 작업을 수행한다고 말하고 싶습니다. numpy/pandas에서'sum (axis = 0) '을 사용할 때 우리는 행 전체에 걸쳐 합을 취하는 것을 의미합니다 (실제 열 집계입니다). – ayhan

+0

@Hisenberg : 나는 그것을 명확히하기 위해 내 대답에 덧붙였다. 궁극적으로 기억하는 방법은 단지 그것을 연습하는 것입니다. 결국에는 생각할 필요가 없습니다. –