파이썬 열 삭제 - paisseon yeol sagje

이번에는 DataFrame에서 특정 열을 삭제하는 방법을 알아보자.

삭제할 때에는 drop이라는 API를 사용하면 되고, axis나 clumns, index를 label과 같이 사용하여 삭제 가능하다. axis는 아무것도 입력하지 않았을경우 default 가 0이다. axis를 지정하지 않고, columns이나 index 없이 달랑 label만 입력 한다면 기본적으로 axis=0, 그리니까 index (열) 에서 label을 찾게 된다. 만약 column을 삭제하고 싶다면 axis1로 설정해야 한다. 아니면 찾질 못한다.

또한, 기본적으로 원본 데이터는 삭제되지 않으며 변현된 DataFrame이 copy되어 return 된다. 이는 parameter 중에 하나인 inplace로 control 되며 default 값이 False이므로 가능한 얘기이다. 만약 inplaceTrue로 하게 되면 return 값은 없고, 원본이 수정된다. 아래 사용 예를 보자.

DataFrame의 열 이나 행의 삭제는 drop을 사용한다.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html?highlight=drop#pandas.DataFrame.drop


0 ~ 11까지를 원소로 가지고, columns label이 각각 A,B,C,D인 3 x 4 Matrix를 이용하기로 한다.

numpy의 arange를 이용해서 생성하고, reshape을 이용해서 2차원 행렬로 변환했다. 

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.arange(12).reshape(3, 4), columns=['A', 'B', 'C', 'D']) 
df
파이썬 열 삭제 - paisseon yeol sagje

아래와 같이 1만 지정하게 되면 어떻게 될까?

df.drop(1)

axis가 default 0이므로, 아래 처럼 index 에서 1이라는 행을 찾고 지우게 된다. 만약 index에 없는 label만 넣는다면 어떻게 될까? df.drop('A') 을 입력하면 KeyError: "['A'] not found in axis" 라고 뜨게 된다. df.drop(0,axis=0), df.drop(index=0)df.drop(0)과 같은 말이다. 두개를 삭제하고 싶다면 df.drop([0,1]) 이런식으로 list로 만들어서 삭제 가능하다.

파이썬 열 삭제 - paisseon yeol sagje

동일한 방법으로 column도 삭제 가능하다. axis를 1로 지정하거나 columns를 이용하면 된다. 마찬가지로 df.drop(columns='A')도 동일하며 여러개를 삭제하고 싶은 경우는 df.drop(columns=['A','B']) 처럼 list로 구성해주면 된다.

df.drop('A',axis=1)
파이썬 열 삭제 - paisseon yeol sagje

참고 : https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html?highlight=drop#pandas.DataFrame.drop

pandas.DataFrame.drop — pandas 1.3.1 documentation

pandas.DataFrame. drop DataFrame. drop ( labels = None , axis = 0 , index = None , columns = None , level = None , inplace = False , errors = 'raise' ) [source] Drop specified labels from rows or columns. Remove rows or columns by specifying label names and corresponding axis, or by specifying direc...

pandas.pydata.org

※ 이 글을 쓰는 사람은 SW 비전공자입니다.

※ 개인 공부를 위해 정리하는 글이며, 작성한 코드들은 효율성, 깔끔함(?) 등과는 거리가 멀 수 있습니다.

1편 : 2021.03.31 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Series, Dataframe 개념 정리

2편 : 2021.04.01 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : 엑셀 파일(.xlsx) Dataframe으로 만들기

3편 : 2021.04.03 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 내부 데이터 조회 방법

4편 : 2021.04.05 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 행, 열 추가 방법

5편 : 2021.04.11 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 행, 열 삭제하기(drop 함수)

6편 : 2021.04.13 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : 원소바꾸기, dropna(), fillna()

7편 : 2021.04.24 - [코딩/Python] - [Python/파이썬] Pandas Dataframe 결합 : Concat

8편 : 2021.04.25 - [코딩/Python] - [Python/파이썬] Pandas Dataframe 결합 : Merge


1) Dataframe의 행, 열 이름 변경

2) Dataframe 조회

   -. 인덱싱

   -. 슬라이싱

   -. 열 조회

   -. 원소 조회

3) 행, 열 추가하기

4) 행, 열 삭제하기(drop)

4) 원소값 바꾸기

5) 결측치(NaN) 관련

  이번 편에서는 Dataframe의 행과 열을 삭제하는 방법에 대해 포스팅한다. Pandas에서는 drop( ) 이라는 함수를 통해 행, 열을 삭제할 수 있다. dataframe은 이전 편까지 활용했던 엑셀 파일을 활용한다.

<코드>

import pandas as pd

#dataframe 생성(엑셀 파일 통해 생성)
df = pd.read_excel("df_test.xlsx", engine="openpyxl")
print(df)
   이름   국어  영어  수학
0  YB  100  90  80
1  SW   70  60  50
2  EJ   40  30  20
3  HJ   10   5   1

1. Dataframe의 행 삭제

  drop( ) 함수 사용법은 간단하다. 행인 경우 index를 통해 접근하거나 특정 조건을 통해 삭제할 수 있다.

1) index 통해 삭제하는 방법

<코드>

df2 = df.drop(index=0, axis=0)
print(df2)
   이름  국어  영어  수학
1  SW  70  60  50
2  EJ  40  30  20
3  HJ  10   5   1

-. index=0인 행을 삭제한다.

-. axis=0은 행을 의미한다. 

-. 여러 인덱스를 한꺼번에 삭제하고 싶다면 아래와 같이 입력한다.

   1,2,3번째 인덱스를 삭제(index=0만 남김)

-. 아래 코드는 행을 삭제한 결과를 'df2'라는 변수에 dataframe을 재할당했다.

<코드>

df2 = df.drop(index=[1,2,3])
print(df2)
   이름   국어  영어  수학
0  YB  100  90  80

-. 만약 원본에서 바로 바꾸고 싶다면 inplace=True를 아래처럼 파라미터로 입력해야 한다.

<코드>

df.drop(index = [0,1], inplace=True)
print(df)
   이름  국어  영어  수학
2  EJ  40  30  20
3  HJ  10   5   1

※ 참고사항 : axis = 0 vs axis = 1

-. axis = 0은 dataframe 행 단위를 수정할 때 필요한 파라미터 값이다.

-. axis = 1은 dataframe 열 단위를 수정할 때 필요한 파라미터 값이다.

-. axis = 1의 경우 정 열을 통째로 수정하는게 아닌 열의 각 요소들을 수정하는 것이다. 아래 참고 링크 기재

    (참고링크 : m.blog.naver.com/PostView.nhn?blogId=tjdrud1323&logNo=221452985303&proxyReferer=https:%2F%2Fwww.google.com%2F)

파이썬 열 삭제 - paisseon yeol sagje
axis = 0, axis=1 차이

-. drop( ) 함수에 index, column이라는 파라미터를 사용하지 않는다면 axis=0 또는 axis=1 파라미터값을 넣어줘야 한다.

   예를 들면 아래와 같은 경우를 말한다.

<코드>

df.drop(['이름','국어'], inplace=True)
print(df)
#에러 발생
KeyError: "['이름' '국어'] not found in axis"

-. KeyError가 발생하는 이유는 설정한 axis에서 '이름', '국어'라는 이름을 찾지 못했기 때문이다.

-. axis를 설정하지 않는 경우 기본값은 axis=0이다.

-. 따라서, 위 코드처럼 Column에 접근하려면 axis=1을 넣어줘야 한다.(index로 접근할 때는 axis=0은 생략 해도  됨. 

    (axis=0이 default 이기 때문)

<코드>

df.drop(['국어','영어'], axis=1, inplace=True)
print(df)
   이름  수학
0  YB  80
1  SW  50
2  EJ  20
3  HJ   1

2) 특정 조건을 통해 행을 삭제하는 방법

  지금까지 했던 방법은 drop( )을 활용한 방식이고 특정 조건을 만족하는 row(행)만 dataframe으로 생성하는 방법이 있다.(필터링) 아래와 같이 코드를 작성해보자. 조건에 만족하지 않는 행은 삭제된다.

<코드>

df3= df[df['이름'] == 'SW']
print(df3)
   이름  국어  영어  수학
1  SW  70  60  50

-. '이름' 열의 'SW'만 필터링하는 조건이다. 

-. 조건이므로 '비교연산자'를 사용해야 함을 주의하자.

2. Dataframe의 열 삭제

  열 삭제는 행 삭제의 파라미터인  index 를  columns으로 바꿔 사용하면 된다.

<코드>

df4 = df.drop(columns = ['국어', '영어'])
print(df4)
   이름  수학
0  YB  80
1  SW  50
2  EJ  20
3  HJ   1

-. column 중 '국어'  열과 '영어'  열을 삭제하는 코드이다. 

- columns이라는 파라미터를 사용하지 않는다면 위에 설명했듯이 axis=1 파라미터를 입력하면 된다.

<코드>

df5 = df.drop(['수학'], axis=1)
print(df5)
   이름   국어  영어
0  YB  100  90
1  SW   70  60
2  EJ   40  30
3  HJ   10   5