본문 바로가기
Programming/python

판다스 axis 매개변수 개념 완벽정리

by 조창대 2021. 7. 1.
반응형

판다스를 공부하면서 매우 헷갈렸던게 행과 열이었다. 

데이터프레임은 2차원 형태의 데이터를 다루기 위한 자료형으로, 행과 열이라는 축을 기준으로 정렬되어 있다.

행(row / index)은 각각의 레코드를 담았고 열(column)은 일반적으로 데이터의 특징을 담는다. 

쉽게 말해서 행은 가로, 열은 세로. 행가열세 행가열세 !!

 

행과 열은 축으로 나타낼 때 행은 x축, 열은 y축으로 나타낸다. 우리가 1차, 2차 방정식 배울 때 봤던 그래프를 떠올리면 된다. 

 

판다스 DataFrame을 다루다보면 행이나 열을 삭제하거나 mean, median, rank 등의 값을 구해야 할 때가 있는데, axis 라는 매개변수를 사용하지 않으면 데이터프레임의 모든 값들이 포함된 결과값을 얻게 된다.

한마디로 말하면 axis는 어떤 걸 기준으로 값을 구할지를 명시해주는 '축'과 같다. 위에 그림에서 x,y,z축들을 axis로 표현한 것도 같은 맥락이다.

 

 

하지만 axis=0과 axis=1의 진행방향은 정반대라 생각하면 된다.

axis=1은 책을 옆으로 쌓는 것과 같다. 가로로 쌓여서 진행방향이 행 방향이다.

 

axis=0은 책을 위로 쌓는 것과 같다. 눕혀진 책이 차곡차곡 세로로 쌓이는 형태라 진행방향이 열 방향이다. 

axis=0이 row 기준이니 가로 방향으로 갈 것으로 예상이 되어 헷갈리지만

진행방향은 반대라고 생각하는게 마음이 편하다.^^

 

먼저 axis를 파라미터로 써서 원하는 값들만 지우는 건 2021.06.07 - [코딩공부] - 파이썬 python drop 함수 활용해서 행 삭제하기 에서도 간단하게 소개가 되었는데, 'axis=' 다음엔 row 이름이나 column 이름, 또는 0이나 1이 따라붙는단 걸 알 수 있다.

 


 

import pandas as pd
import numpy as np


names = ['dongwook', 'sineui', 'ikjoong', 'yoonsoo']
english_scores = [50, 89, 68, np.nan]
math_scores = [86, 31, 91, 75]

dict1 = {
    'name': names, 
    'english_score': english_scores, 
    'math_score': math_scores
}
df=pd.DataFrame(dict1)
df

>>>
       name  english_score  math_score
0  dongwook           50.0          86
1    sineui           89.0          31
2   ikjoong           68.0          91
3   yoonsoo            NaN          75
>>>

이제 이 데이터프레임에 drop, mean, median, rank 함수를 적용하며 axis의 개념을 이해해보자.

 

  • drop()
df.drop([1,2],axis=0)

>>>
       name  english_score  math_score
0  dongwook           50.0          86
3   yoonsoo            NaN          75
>>>

drop 함수에 파라미터로 삭제할 열을 넣고 axis=0을 넣고 살펴보니

세로로 차곡차곡 쌓여있던 인덱스 1,2번의 책들만 삭제됐다. axis 매개변수 앞에는 삭제할 row 이름이나 column 이름을 지정해주면 선택적으로 삭제할 수 있다. 

 

df.drop('english_score',axis=1)

>>>
       name    math_score
0  dongwook            86
1    sineui            31
2   ikjoong            91
3   yoonsoo            75
>>>

이번엔 axis=1로 했더니 영어점수 열에 속한 모든 레코드들이 삭제된 걸 확인할 수 있다.

 

참고로 drop은 기존 df을 건들이지 않고 새로운 df을 만들어서 리턴하므로  'inplace=True'를 추가해야 기존 df에 결과값이 저장된다.

 

 

  • mean()
df[['english_score','math_score']].mean(axis=0)

>>>
english_score    69.00
math_score       70.75
dtype: float64
>>>

mean(axis=0)은 직역하면 행(row)들의 평균을 구한다. 이다.

앞에 df[['english_score','math_score']] 라고 특정 열을 기준으로 데이터프레임 범위를 지정해줬으니 'english_score','math_score'열들의 라는 말이 추가된다.

합치면 english_score','math_score'열(column)에 포함된 행(row)들의 평균을 구한다. 

얼핏 보면 가로 방향으로 평균을 구해야 될 것 같아서 헷갈리지만, axis=0이 열 방향으로 작동한다는 걸 생각하면

각 열의 평균을 구하는 결과값이 나오는 걸 이해할 수 있다.

 

df[['english_score','math_score']].mean(axis=1)

>>>
0    68.0
1    60.0
2    79.5
3    75.0
dtype: float64
>>>

역시 옆으로 쌓이는 책을 생각해보면, axis=1은 행 방향으로 진행한다.

0 인덱스의 english_score의 값(50.0)과 math_score의 값(86)의 평균은 68.0

각 행(row)에 포함된 각 열(column) 값의 평균이 구해졌다.

  • median()
df.median(axis=0)

>>>
english_score    68.0
math_score       80.5
dtype: float64
>>>

median도 mean 함수와 비슷한 결과값이 리턴된다.

median은 값들의 중간값을 알려주는 함수인데, 이런 함수들은 문자열은 취급하지 않으니 당연히 'name'열 값들은 계산되지 않았다.

 

df.median(axis=1)

>>>
0    76.0
1    88.0
2    68.0
3    68.0
dtype: float64
>>>

 

 

  • rank()
df[['english_score','math_score']].rank(axis=0)

>>>
	english_score	math_score
0	          1.0	       3.0
1	          3.0	       1.0
2	          2.0	       4.0
3	          NaN	       2.0
>>>

rank 함수는 각 행이나 열의 안에 있는 요소들끼리의 순위를 매긴다.

진행방향이 세로인 axis=0을 매개로 해줬으니 각 열들 안에서 순위가 매겨진다. 결측값은 순위 안매겨짐. 깍두기

 

df[['english_score','math_score']].rank(axis=1)

>>>
	english_score	math_score
0	          1.0	       2.0
1	          2.0	       1.0
2	          1.0	       2.0
3	          NaN	       1.0
>>>

rank(axis=1)은 가로 방향에 있는 레코드끼리 순위를 매긴다.

0 인덱스의 학생은 영어를 수학보다 잘한다. 1 인덱스의 학생은 그 반대.

 


 

행과 열, axis 매개변수까지 알아보았다. 나도 처음엔 행가열세로 외우다 보니 당연히 진행방향도 똑같은 줄 알아서 axis를 이해하는데 꽤 애먹었다.

헷갈릴 때마다 위에 책 그림을 떠올리면 금방 생각날 것이다.

 

다시 한번 정리하자면,

axis=0은 각 열(row)의 모든 행(column)에 대해 동작한다. 진행방향 세로. 결과값이 행으로 나타남. 

axis=1은 각 행(column)의 모든 열(row)에 대해 동작한다. 진행방향 가로. 결과값이 열로 나타남.

반응형