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 행렬들이 표기되는지 볼 수 있었습니다. 마지막으로 어떻게 인덱스 및 인덱스 범위, 그리고 조건들을 기반으로 행을 삭제하는 방법을 배웠습니다.
이 글을 좋아한다면 편하게 공유하세요.