Original article: Data Analytics with Pandas – How to Drop a List of Rows from a Pandas Dataframe

Pandas Dataframe은 행과 열에 데이터를 저장할 수 있는 2차원 데이터 구조입니다. 데이터를 분석할 때 무척 유용합니다.

Dataframe에 데이터 기록 목록을 가지고 있을 때, 모델의 필요성과 분석을 학습할 때 목표에 따라서 특정 행을 제거해야 할 수도 있습니다.

이번 튜토리얼에서는 Pandas dataframe에서 일련의 행을 어떻게 제거하는지 배울 것입니다.

열을 제거하는 방법을 배우기 위해서는 이 글을 참고하세요: How to Drop Columns in Pandas

Pandas Dataframe에서 행 또는 열을 제거하는 법

Dataframe에서 행 또는 열을 제거하려면 dataframe에서 사용가능한 drop() 메소드를 이용해야 합니다. drop() 메소드에 대해서 여기 공식 문서에서 상세히 읽을 수 있습니다.

Dataframe Axis(축)

  • 행은 axis=0으로 나타내고
  • 열은 axis=1으로 나타납니다.

Dataframe Labels(표기)

  • 행은 기본적으로 0으로 시작하는 인덱스 번호로 표기되고
  • 열은 이름을 이용하여 표기됩니다.

Drop() 메소드 매개변수

  • index - 삭제할 행의 목록
  • axis=0 - dataframe의 행이 삭제될 것이라는 표기
  • inplace=True - 삭제 연산 중에 새로운 dataframe 객체를 생성하는 대신 동일한 dataframe에서 제거 연산을 실행합니다.

Pandas DataFrame 예제

예시 dataframe은 product_name, Unit_Price, No_Of_Units, Available_Quantity, Available_Since_Date 열을 포함하고 있습니다. 또한 결측값(missing values)을 표기하는데 사용된 NaN 값이 있는 행도 있습니다.

import pandas as pd
data = {"product_name":["Keyboard","Mouse", "Monitor", "CPU","CPU", "Speakers",pd.NaT],
        "Unit_Price":[500,200, 5000.235, 10000.550, 10000.550, 250.50,None],
        "No_Of_Units":[5,5, 10, 20, 20, 8,pd.NaT],
        "Available_Quantity":[5,6,10,"Not Available","Not Available", pd.NaT,pd.NaT],
        "Available_Since_Date":['11/5/2021', '4/23/2021', '08/21/2021','09/18/2021','09/18/2021','01/05/2021',pd.NaT]
       }
df = pd.DataFrame(data)
df

Dataframe은 이렇게 보일 것입니다:

product_name Unit_Price No_Of_Units Available_Quantity Available_Since_Date
0 Keyboard 500.000 5 5 11/5/2021
1 Mouse 200.000 5 6 4/23/2021
2 Monitor 5000.235 10 10 08/21/2021
3 CPU 10000.550 20 Not Available 09/18/2021
4 CPU 10000.550 20 Not Available 09/18/2021
5 Speakers 250.500 8 NaT 01/05/2021
6 NaT NaN NaT NaT NaT

그리고 우리가 만든 예시 dataframe과 같습니다.
각각의 제거 작업 후 dataframe을 일반 HTML 표 형태로 출력하는 df를 이용해서 dataframe을 출력할 것입니다.
Dataframe을 다른 시각적 형태로 출력하는 방법에 대해서는 여기 Pretty Print a Dataframe에서 읽을 수 있습니다.
다음으로, 행을 제거하는 다른 활용 사례들을 배우겠습니다.

Pandas에서 인덱스를 이용해 행을 삭제하는 법

Pandas에서 인덱스 목록을 drop() 메소드의 매개변수로 넘겨서 일련의 행을 제거할 수 있습니다.

df.drop([5,6], axis=0, inplace=True)
df

이 코드에서,

  • [5,6]은 당신이 제거하고 싶은 인덱스를
  • axis=0은 dataframe에서 행이 제거된다는 표기를
  • inplace=True는 동일한 dataframe에서 삭제 연산을 실행합니다.

인덱스 5와 6을 가진 행을 삭제한 후, 아래와 같은 데이터를 dataframe에 가질 것입니다:

product_name Unit_Price No_Of_Units Available_Quantity Available_Since_Date
0 Keyboard 500.000 5 5 11/5/2021
1 Mouse 200.000 5 6 4/23/2021
2 Monitor 5000.235 10 10 08/21/2021
3 CPU 10000.550 20 Not Available 09/18/2021
4 CPU 10000.550 20 Not Available 09/18/2021

이것이 특정 인덱스를 가지고 행을 제거할 수 있는 방법입니다.
다음으로, 인덱스 범위를 삭제하는 것에 대해 배우겠습니다.

Pandas에서 인덱스 범위를 이용해 행을 삭제하는 방법

특정 범위 안에 포함된 일련의 행을 삭제할 수 있습니다.
범위라는 것은 하한선과 상한선을 가진 값들의 세트입니다.
이 방법은 특정 범위의 데이터를 제외한 예시 데이터셋을 생성하길 원할 때 유용할 수도 있습니다.
Dataframe에 df.index() 메소드를 사용하여 행의 범위를 생성할 수 있습니다. 그리고나서 그 범위를 drop() 메소드로 넘겨 아래와 같이 행을 삭제할 수 있습니다.

df.drop(df.index[2:4], inplace=True)
df

이 코드에서 수행하는 동작입니다:

  • df.index[2:4]가 2에서 4까지 행의 범위를 생성합니다. 범위의 하한선은 포함되어 있고 상한선은 제외됩니다. 다시 말해서 2행과 3행이 제거 되고 4행은 제거되지 않는다는 의미입니다.
  • inplace=True는 동일한 dataframe에서 삭제 연산을 실행합니다.

2에서 4 사이 범위안의 행을 삭제한 후, 아래와 같은 데이터를 dataframe에 가질 것입니다:

product_name Unit_Price No_Of_Units Available_Quantity Available_Since_Date
0 Keyboard 500.00 5 5 11/5/2021
1 Mouse 200.00 5 6 4/23/2021
4 CPU 10000.55 20 Not Available 09/18/2021

이것이 (인덱스) 범위를 이용해서 dataframe안에 일련의 행을 삭제할 수 있는지 방법입니다.

Pandas에서 인덱스 이후 모든 행을 삭제하는 방법

iloc[]을 이용하려 특정 인덱스 이후 모든 행을 삭제할 수 있습니다.
iloc[]은 양수 인덱스를 사용하여 행을 선택하기 위해 사용할 수 있습니다. 시작점과 끝점을 :으로 구분시켜 명시할 수 있습니다. 예를 들어, 2:3을 2행부터 3행까지 선택하기 위해 사용할 수 있습니다. 만약 모든 행을 선택하고 싶다면 그냥 :iloc[]에 사용하실 수 있습니다.

이 방법은 당신이 데이터셋을 학습(training)과 시험(testing) 목적으로 나누고자 할 때 유용할 수도 있습니다.
0부터 인덱스 2까지 행을 선택하기 위해 아래를 사용하세요. 이것은 인덱스 2 이후 행을 삭제하는 결과를 냅니다.

df = df.iloc[:2]
df

이 코드에서, :2는 인덱스 2에 이르기까지 행을 선택합니다.

이것이 특정 인덱스 이후 모든 행을 삭제할 수 있는지 방법입니다.
인덱스 2 이후 행을 삭제한 후, 아래와 같은 데이터를 dataframe에 가질 것입니다:

product_name Unit_Price No_Of_Units Available_Quantity Available_Since_Date
0 Keyboard 500.0 5 5 11/5/2021
1 Mouse 200.0 5 6 4/23/2021

이것이 특정 인덱스 이후 모든 행을 삭제할 수 있는지 방법입니다.

다음으로, 조건을 가진 행을 삭제하는 방법에 대해 배우겠습니다.

Pandas에서 여러 조건을 가진 행을 삭제하는 법

Dataframe에서 특정 조건을 기반으로 행을 삭제할 수 있습니다.
예를 들어, 열의 값이 X보다 크고 Y보다 작은 행을 삭제할 수 있습니다.
이 방법은 당신이 데이터셋을 특정 값을 가진 열을 무시하고 생성하고자 할 때 유용할 수도 있습니다.
지정 조건을 기반으로 행을 삭제하기 위해서는, 특정 조건을 전달하는 행의 인덱스를 선택하고 그 인덱스를 drop() 메소드로 넘깁니다.

df.drop(df[(df['Unit_Price'] >400) & (df['Unit_Price'] < 600)].index, inplace=True)
df

이 코드에서,

  • (df['Unit_Price'] >400) & (df['Unit_Price'] < 600)은 행을 삭제하기 위한 조건이고
  • df[].index는 조건을 넘기는 행의 인덱스를 선택하며
  • inplace=True는 새로운 것(dataframe)을 만드는 대신 동일한 dataframe에서 삭제 연산을 실행합니다.

unit_price가 400보다 크고 600보다 작은 것을 가진 조건에 해당하는 행을 삭제한 후, 아래와 같은 데이터를 dataframe에 가질 것입니다:

이것이 지정 조건을 이용해서 dataframe의 행을 삭제할 수 있는지 방법입니다.

결론

요약하면 이 글에서 Pandas dataframe에서 drop() 메소드가 무엇인지 배웠습니다. 또한 어떻게 dataframe 행렬들이 표기되는지 볼 수 있었습니다. 마지막으로 어떻게 인덱스 및 인덱스 범위, 그리고 조건들을 기반으로 행을 삭제하는 방법을 배웠습니다.

이 글을 좋아한다면 편하게 공유하세요.

좋아할지도 모르는 글