Pandas Dataframe / Numpy Array "축"정의의 모호성


95

파이썬 축이 어떻게 정의되는지, 그리고 이들이 DataFrame의 행이나 열을 참조하는지에 대해 매우 혼란 스러웠습니다. 아래 코드를 고려하십시오.

>>> df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], columns=["col1", "col2", "col3", "col4"])
>>> df
   col1  col2  col3  col4
0     1     1     1     1
1     2     2     2     2
2     3     3     3     3

따라서를 호출 df.mean(axis=1)하면 행에 걸쳐 평균을 얻을 수 있습니다.

>>> df.mean(axis=1)
0    1
1    2
2    3

그러나를 호출 df.drop(name, axis=1)하면 실제로 행이 아닌 column을 삭제합니다 .

>>> df.drop("col4", axis=1)
   col1  col2  col3
0     1     1     1
1     2     2     2
2     3     3     3

누군가가 pandas / numpy / scipy에서 "축"이 무엇을 의미하는지 이해하도록 도와 줄 수 있습니까?

참고로 DataFrame.mean잘못 정의되었을 수 있습니다. 것이 문서에 말한다 DataFrame.mean이가 axis=1열이 아닌 행에 걸쳐 평균을 뜻한다 ...


별칭, 'columns''index'/ 'rows'에 대한 자세한 설명은 아래 답변을 참조하십시오 .
Ted Petrou 2011

이것은 단지 이상합니다. 축은 meandrop. 실제 행동에 도달하려면 비선형 적 사고가 필요합니다.
StephenBoesch

답변:


170

0 = down1 = across 로 기억하는 것이 가장 간단합니다 .

이것은 다음을 의미합니다.

  • axis=0각 열 아래 또는 행 레이블 (인덱스)에 메서드를 적용하는 데 사용 합니다.
  • axis=1각 행 또는 열 레이블에 방법을 적용하는 데 사용 합니다.

다음은 각 축이 참조하는 DataFrame의 부분을 보여주는 그림입니다.

Pandas가 NumPy의 단어 사용을 따른다는 것을 기억하는 것도 유용합니다 axis. 사용법은 NumPy의 용어집에 설명되어 있습니다 .

축은 차원이 두 개 이상인 배열에 대해 정의됩니다. 2 차원 배열에는 두 개의 해당 축이 있습니다. 첫 번째 축은 행을 가로 질러 수직 으로 아래로 이동하고 (축 0) 두 번째 축은 열을 가로 질러 가로로 이동합니다 (축 1) . [ 내 강조점 ]

따라서 질문의 방법과 관련하여는 df.mean(axis=1)올바르게 정의 된 것 같습니다. 열을 가로 질러 가로로 , 즉 각 개별 행을 따라 항목의 평균을 취합니다 . 반면에는 행에 걸쳐df.mean(axis=0) 수직 으로 아래쪽으로 작동하는 작업 입니다.

마찬가지로 df.drop(name, axis=1)가로 축을 직관적으로 가로 지르기 때문에 열 레이블에 대한 작업을 나타냅니다. 지정 axis=0하면 메서드가 대신 행에서 작동합니다.


3
나를 힘들게 만든 것은 df.apply (..., axis = 0)이 축 0 (인덱스)을 "넘어가는"것이 아니라 모든 인덱스를 포함하는 Series를 되 돌리는 열을 넘기고 있다는 것입니다. 단서는 df.apply (..., axis = 0)이 Series를 반환하므로 전체 인덱스에 대해 실행되는 작업을 적용 할 수 있다는 것입니다.
moritzschaefer

2
df.apply같은 방법으로 보아도 도움이된다고 생각합니다 df.sum. 예를 들어, df.sum(axis=0)DataFrame의 각 열을 합산합니다. 마찬가지로 df.apply(sum, axis=0)정확히 동일한 작업을 수행하도록 작성할 수 있습니다 . 작업이 실제로 DataFrame의 각 열에 적용되지만, 실제 기능은 0 축 아래로 실행
알렉스 라일리

명명 및 순서 규칙이 R의 적용 기능 과 반대 라는 것은 유감입니다. R에서 더 낮은 ( pandas에서 와 유사 ) 값 "1"은 함수가 각 행에 적용됨 의미하는 "행"에 해당 하고 "2"의 더 큰 값은 "열"을 의미하며 이는 함수가 각 열에 적용됨 의미합니다 . MARGINaxis
Keith Hughitt

판다의 파괴적인 버그
Calculus

10

설명하는 또 다른 방법 :

// Not realistic but ideal for understanding the axis parameter 
df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]],
                  columns=["idx1", "idx2", "idx3", "idx4"],
                  index=["idx1", "idx2", "idx3"]
                 )

---------------------------------------1
|          idx1  idx2  idx3  idx4
|    idx1     1     1     1     1
|    idx2     2     2     2     2
|    idx3     3     3     3     3
0

df.drop(축은 위치를 의미)

A: I wanna remove idx3.
B: **Which one**? // typing while waiting response: df.drop("idx3",
A: The one which is on axis 1
B: OK then it is >> df.drop("idx3", axis=1)

// Result
---------------------------------------1
|          idx1  idx2     idx4
|    idx1     1     1     1
|    idx2     2     2     2
|    idx3     3     3     3
0

정보 df.apply(축은 방향을 의미)

A: I wanna apply sum.
B: Which direction? // typing while waiting response: df.apply(lambda x: x.sum(),
A: The one which is on *parallel to axis 0*
B: OK then it is >> df.apply(lambda x: x.sum(), axis=0)

// Result
idx1    6
idx2    6
idx3    6
idx4    6

축 1과 축 0에 평행 한 것은 같은 의미라고 생각하지 않습니까?
Nuance

9

이미 적절한 답이 있지만 2 차원을 초과하는 또 다른 예를 들겠습니다.

파라미터 axis변경할 축을 의미 합니다.
예를 들어 차원이 axbxc 인 데이터 프레임이 있다고 가정 합니다.

  • df.mean(axis=1)차원이 ax 1 xc 인 데이터 프레임을 반환합니다 .
  • df.drop("col4", axis=1)차원이 ax (b-1) xc 인 데이터 프레임을 반환합니다 .

여기서, axis=1상기 제 2 축선을 의미 b하므로, b값이 예에서 변화 될 것이다.


1
이 답변은 제가이 주제에 대해 본 어떤 시각화보다 더 직관적입니다. 그러나 xarray는 pandas보다 다차원 배열에 더 좋습니다.
alys

2

문자열 별칭 'index''columns' 를 정수 0/1 대신 사용할 수 있다는 것이 더 널리 알려져 있습니다. 별칭은 훨씬 더 명확하며 계산이 어떻게 수행되는지 기억하는 데 도움이됩니다. 'index'의 또 다른 별칭은 'rows' 입니다.

axis='index'사용되며, 다음 계산은 혼란 열, 아래로 일어난다. 그러나 다른 행과 같은 크기의 결과를 얻는 것으로 기억합니다.

제가 말하는 내용을 확인하기 위해 화면에 데이터를 가져 오겠습니다.

df = pd.DataFrame(np.random.rand(10, 4), columns=list('abcd'))
          a         b         c         d
0  0.990730  0.567822  0.318174  0.122410
1  0.144962  0.718574  0.580569  0.582278
2  0.477151  0.907692  0.186276  0.342724
3  0.561043  0.122771  0.206819  0.904330
4  0.427413  0.186807  0.870504  0.878632
5  0.795392  0.658958  0.666026  0.262191
6  0.831404  0.011082  0.299811  0.906880
7  0.749729  0.564900  0.181627  0.211961
8  0.528308  0.394107  0.734904  0.961356
9  0.120508  0.656848  0.055749  0.290897

모든 열의 평균 axis='index'을 얻으려면 다음을 사용 합니다.

df.mean(axis='index')
a    0.562664
b    0.478956
c    0.410046
d    0.546366
dtype: float64

동일한 결과는 다음과 같이 얻을 수 있습니다.

df.mean() # default is axis=0
df.mean(axis=0)
df.mean(axis='rows')

행에서 왼쪽에서 오른쪽으로 작업을 사용하려면 axis = 'columns'를 사용하십시오. DataFrame에 추가 열이 추가 될 수 있다고 생각하여 기억합니다.

df.mean(axis='columns')
0    0.499784
1    0.506596
2    0.478461
3    0.448741
4    0.590839
5    0.595642
6    0.512294
7    0.427054
8    0.654669
9    0.281000
dtype: float64

동일한 결과는 다음과 같이 얻을 수 있습니다.

df.mean(axis=1)

축 = 0 / 인덱스 / 행으로 새 행 추가

이 결과를 사용하여 추가 행 또는 열을 추가하여 설명을 완료 해 보겠습니다. 따라서 axis = 0 / index / rows를 사용할 때마다 DataFrame의 새 행을 얻는 것과 같습니다. 행을 추가해 보겠습니다.

df.append(df.mean(axis='rows'), ignore_index=True)

           a         b         c         d
0   0.990730  0.567822  0.318174  0.122410
1   0.144962  0.718574  0.580569  0.582278
2   0.477151  0.907692  0.186276  0.342724
3   0.561043  0.122771  0.206819  0.904330
4   0.427413  0.186807  0.870504  0.878632
5   0.795392  0.658958  0.666026  0.262191
6   0.831404  0.011082  0.299811  0.906880
7   0.749729  0.564900  0.181627  0.211961
8   0.528308  0.394107  0.734904  0.961356
9   0.120508  0.656848  0.055749  0.290897
10  0.562664  0.478956  0.410046  0.546366

축 = 1 / 열로 새 열 추가

마찬가지로 axis = 1 / columns 일 때 자체 열로 쉽게 만들 수있는 데이터를 생성합니다.

df.assign(e=df.mean(axis='columns'))

          a         b         c         d         e
0  0.990730  0.567822  0.318174  0.122410  0.499784
1  0.144962  0.718574  0.580569  0.582278  0.506596
2  0.477151  0.907692  0.186276  0.342724  0.478461
3  0.561043  0.122771  0.206819  0.904330  0.448741
4  0.427413  0.186807  0.870504  0.878632  0.590839
5  0.795392  0.658958  0.666026  0.262191  0.595642
6  0.831404  0.011082  0.299811  0.906880  0.512294
7  0.749729  0.564900  0.181627  0.211961  0.427054
8  0.528308  0.394107  0.734904  0.961356  0.654669
9  0.120508  0.656848  0.055749  0.290897  0.281000

다음 개인 변수를 사용하여 모든 별칭을 볼 수 있습니다.

df._AXIS_ALIASES
{'rows': 0}

df._AXIS_NUMBERS
{'columns': 1, 'index': 0}

df._AXIS_NAMES
{0: 'index', 1: 'columns'}

1

axis = 'rows'또는 axis = 0이면 행 방향으로 요소에 액세스하는 것을 의미합니다. 축 = 0을 따라 합계를 적용하면 각 열의 합계가 제공됩니다.

axis = 'columns'또는 axis = 1이면 왼쪽에서 오른쪽으로 열 방향으로 요소에 액세스하는 것을 의미합니다. axis = 1 따라 합계를 적용하면 각 행의 합계를 얻습니다.

아직도 혼란 스럽습니다! 그러나 위의 내용은 나를 조금 더 쉽게 만듭니다.


0

다른 모든 답변이 혼란 스럽습니다. 내가 그것에 대해 어떻게 생각하는지 :

axis=0: 결과의 모양이 수평 (행)
axis=1: 결과의 모양이 수직 (열)

그래서

  • df.drop(name, axis=1): 컬럼 삭제
  • df.mean(axis=1): 열을 계산합니다 (결과를 새 열로 추가 할 수 있음).
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.