판다스를 공부하면서 매우 헷갈렸던게 행과 열이었다.
데이터프레임은 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)에 대해 동작한다. 진행방향 가로. 결과값이 열로 나타남.
'Programming > python' 카테고리의 다른 글
파이썬 python drop, rename, isin 함수로 데이터 정제하기 -1 (0) | 2021.07.19 |
---|---|
판다스 pandas IQR 활용해서 이상점(outlier) 찾고 삭제하기 (0) | 2021.07.12 |
파이썬 python groupby 함수 이용해서 여성 비율이 높은 직업 알아보기 (0) | 2021.06.25 |
파이썬 python drop 함수 활용해서 행 삭제하기 (0) | 2021.06.07 |
DataFrame과 for문 이용하여 큰 데이터 다루기 (0) | 2021.05.27 |