HOWTO · Pandas
Pandas드롭 행
이 자습서에서는 pandas.DataFrame.drop() 메서드를 사용하여 Pandas에서 행을 삭제하는 방법을 설명합니다.
이 페이지의 내용
이 튜토리얼에서는 pandas.DataFrame.drop()를 사용해 pandas DataFrame에서 행을 제거하는 방법을 설명합니다. drop()에 전달하는 값은 인덱스 레이블입니다. 기본 정수 인덱스에서는 레이블이 행 위치처럼 보일 때가 많지만, 레이블이 본질적으로 위치를 뜻하는 것은 아닙니다. 아래 예제에서는 레이블을 직접 선택하고, 위치를 레이블로 변환하고, 열 조건에 맞는 행을 제거하는 방법을 보여 줍니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
people = pd.DataFrame(
{"Name": ["Himansh", "Prateek", "Abhishek", "Vidit", "Anupam"],
"Age": [30, 33, 35, 30, 30]}
)
remaining = people.drop([0, 2])
print(remaining)
인덱스 레이블로 행 삭제
레이블 하나 또는 레이블 목록을 drop()에 전달합니다. 앞의 예제에서 기본 인덱스는 0부터 4까지이므로 레이블 0과 2는 각각 첫 번째 행과 세 번째 행을 가리킵니다. 반환된 DataFrame은 남은 행의 기존 레이블을 유지하며, pandas가 자동으로 번호를 다시 매기지는 않습니다. 이후 작업에 연속된 새 인덱스가 유용하다면 reset_index(drop=True)를 사용하세요.
사용자 지정 인덱스에서는 실제 레이블을 전달합니다. 다음 독립 예제에서는 이름을 레이블로 사용합니다. 따라서 "A"와 "C"가 첫 번째 항목과 세 번째 항목을 선택하는 것은 해당 행에 이 레이블이 지정되어 있기 때문입니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
people = pd.DataFrame(
{"Name": ["Himansh", "Prateek", "Abhishek", "Vidit", "Anupam"],
"Age": [30, 33, 35, 30, 30]},
index=["A", "B", "C", "D", "E"],
)
remaining = people.drop(["A", "C"])
print(remaining)
인덱스에 없는 레이블을 전달하면 기본적으로 KeyError가 발생합니다. 레이블이 선택 사항이라면 errors="ignore"를 전달해 없는 레이블을 건너뛸 수 있습니다. 다만 오타가 있는 레이블도 감춰질 수 있으므로 신중하게 사용하세요.
위치를 기준으로 행 삭제
drop()은 행 위치가 아니라 레이블을 받습니다. 0부터 시작하는 위치를 기준으로 행을 제거하려면 먼저 인덱스에서 해당 위치를 선택한 다음, 그 결과로 얻은 레이블을 drop()에 전달하세요. 인덱스가 사용자 지정이거나 순서가 바뀐 경우에는 이 구분이 중요합니다. 다음 예제만으로 필요한 내용을 확인할 수 있습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
people = pd.DataFrame(
{"Name": ["Himansh", "Prateek", "Abhishek", "Vidit", "Anupam"],
"Age": [30, 33, 35, 30, 30]},
index=["A", "B", "C", "D", "E"],
)
positions = [0, 2]
labels = people.index.take(positions)
remaining = people.drop(labels)
print(remaining)
이 예제에서는 제거하기 전에 위치 0과 2를 레이블 "A"와 "C"로 변환합니다. 레이블을 이미 알고 있다면 앞 절처럼 바로 사용하세요. 선택한 행을 제거하는 대신 남기려는 경우에는 iloc으로 위치 기반 선택을 표현할 수도 있습니다.
열 값에 따라 행 삭제
조건에 맞는 행을 제거하려면 해당 행의 인덱스 레이블을 찾아 drop()에 전달하세요. 이 예제의 조건은 나이가 33 이하인 행을 선택하므로, 결과 DataFrame에는 33세보다 나이가 많은 사람들만 남습니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import pandas as pd
people = pd.DataFrame(
{"Name": ["Himansh", "Prateek", "Abhishek", "Vidit", "Anupam"],
"Age": [31, 33, 35, 36, 34]},
index=["A", "B", "C", "D", "E"],
)
remove_labels = people.index[people["Age"] <= 33]
remaining = people.drop(remove_labels)
print(remaining)
조건으로 제거할 행을 지정하는 방식은 제거 대상이 명확할 때 유용합니다. 어떤 행을 남길지 설명하는 편이 더 쉽다면 people[people["Age"] > 33]처럼 불리언 필터링을 사용하세요. 이 조건에서는 두 방법 모두 조건에 따라 남는 행을 반환합니다. 남길 기준이 핵심일 때는 필터링이 더 읽기 쉬울 수 있습니다.
DataFrame.drop()의 동작과 흔한 실수 이해하기
pandas.DataFrame.drop()는 기본적으로 새 DataFrame을 반환하고 원본 객체는 변경하지 않습니다. 각 예제처럼 결과를 변수에 할당하거나, 뒤이은 식에서 반환값을 사용하세요. inplace=True 옵션은 원본 객체를 변경하고 None을 반환합니다. people = people.drop(...)처럼 결과를 할당하면 반환값이 분명해져 대체로 이해하기 쉽습니다.
기본적으로 drop()은 인덱스에서 레이블을 제거합니다. 열 레이블을 제거하려면 axis="columns" 또는 columns=[...]를 지정하세요. 이 글에서는 행 레이블을 다룹니다. 기본 정수 인덱스에서는 레이블이 위치처럼 보일 수 있지만, 사용자 지정 인덱스에서는 둘의 차이가 분명해집니다. 결과가 예상과 다르면 people.index를 확인하고, 조건이 제거하려는 행을 선택하는지 살펴본 다음, drop()의 반환값을 저장했는지 확인하세요.