Pandas DataFrame에서 조건식을 기반으로 행 삭제하기
Pandas DataFrame에서 특정 조건을 만족하는 행을 삭제하는 것은 데이터 전처리 과정에서 자주 사용되는 작업입니다. 이를 위해 다양한 방법을 사용할 수 있습니다.
Boolean Indexing을 이용한 방법
- 조건식 생성: 삭제하고 싶은 행에 해당하는 조건을 논리값(True/False)으로 나타내는 Series를 생성합니다.
- 인덱싱: 생성된 Series를 이용하여 DataFrame에서 해당하는 행을 선택하고,
drop()
메서드를 사용하여 삭제합니다.
import pandas as pd
# 예시 DataFrame 생성
data = {'column1': [1, 2, 3, 4, 5],
'column2': ['a', 'b', 'c', 'd', 'e']}
df = pd.DataFrame(data)
# column1의 값이 3보다 큰 행 삭제
df = df[df['column1'] <= 3]
print(df)
query() 메서드를 이용한 방법
- SQL-like 문법: SQL의
WHERE
절과 유사한 문법으로 조건을 지정하여 DataFrame을 필터링합니다.
# column1의 값이 3보다 큰 행 삭제
df = df.query('column1 <= 3')
print(df)
drop() 메서드를 직접 이용하는 방법
- 인덱스 지정: 삭제할 행의 인덱스를 직접 지정하여
drop()
메서드를 사용합니다.
# 인덱스 2, 3번 행 삭제
df = df.drop([2, 3])
print(df)
isin() 메서드를 이용한 방법
- 특정 값 포함 여부: 특정 값을 포함하는 행을 삭제할 때 유용합니다.
# column2의 값이 'c' 또는 'd'인 행 삭제
df = df[~df['column2'].isin(['c', 'd'])]
print(df)
loc 또는 iloc을 이용한 방법
- 행과 열을 동시에 선택:
loc
은 레이블 기반,iloc
은 정수 기반 인덱싱을 사용하여 행과 열을 선택하고,drop()
메서드로 삭제합니다.
# 0번째부터 2번째 행까지 선택 후 삭제
df = df.drop(df.index[:3])
print(df)
주의사항
- inplace:
drop()
메서드의inplace=True
옵션을 사용하면 원본 DataFrame을 수정하지만, 새로운 DataFrame을 생성하는 것이 일반적입니다. - 복사: DataFrame을 복사하여 작업하는 것이 좋습니다. 원본 데이터를 보존해야 하기 때문입니다.
- 조건식: 복잡한 조건을 사용할 때는 조건식을 미리 변수에 저장하여 코드 가독성을 높일 수 있습니다.
어떤 방법을 사용할지는 데이터의 형태, 조건의 복잡성, 개인의 선호에 따라 달라질 수 있습니다.
더 자세한 내용은 Pandas 공식 문서를 참고하세요:
예시:
- "특정 열의 값이 NaN인 행을 모두 삭제하고 싶습니다."
- "복수의 조건을 만족하는 행을 삭제하고 싶습니다."
- "인덱스를 기준으로 일정 간격의 행을 삭제하고 싶습니다."
Pandas DataFrame에서 조건에 따른 행 삭제: 다양한 예시 코드
특정 열의 값이 특정 값보다 큰 행 삭제
import pandas as pd
# 샘플 데이터 생성
data = {'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50]}
df = pd.DataFrame(data)
# B열의 값이 30보다 큰 행 삭제
df = df[df['B'] <= 30]
print(df)
두 개의 조건을 모두 만족하는 행 삭제
# A열이 2보다 크고 B열이 40보다 작은 행 삭제
df = df[(df['A'] <= 2) | (df['B'] >= 40)]
print(df)
특정 값을 포함하는 행 삭제
# A열에 3이 포함된 행 삭제
df = df[df['A'] != 3]
print(df)
NaN 값을 포함하는 행 삭제
# NaN 값이 있는 행 삭제 (모든 열 기준)
df = df.dropna()
print(df)
# 특정 열에서만 NaN 값이 있는 행 삭제
df = df.dropna(subset=['A'])
print(df)
복잡한 조건 (함수 활용)
def custom_condition(x):
return x['A'] > 2 and x['B'] < 45
# custom_condition 함수를 적용하여 행 삭제
df = df[df.apply(custom_condition, axis=1)]
print(df)
인덱스를 이용한 행 삭제
# 1번 인덱스의 행 삭제
df = df.drop(index=1)
print(df)
특정 기간의 데이터 삭제 (날짜 인덱스인 경우)
# 날짜 인덱스가 있는 DataFrame 가정
df = df[df.index < '2023-11-01']
print(df)
추가 설명
- Boolean Indexing: 조건을 만족하는 행에 대해 True, 아니면 False를 반환하는 Series를 생성하여 DataFrame에 적용하는 방법입니다.
- query() 메서드: SQL과 유사한 문법으로 조건을 지정할 수 있습니다.
- dropna() 메서드: NaN 값을 포함하는 행을 삭제합니다.
- apply() 메서드: 각 행 또는 열에 사용자 정의 함수를 적용하여 새로운 Series를 생성합니다.
주의 사항:
- "특정 열의 값이 특정 문자열로 시작하는 행을 삭제하고 싶습니다."
- "두 개의 DataFrame을 합친 후, 중복된 행을 삭제하고 싶습니다."
- "시간 데이터를 기준으로 특정 시간대의 데이터만 남기고 싶습니다."
Pandas DataFrame에서 행 삭제: 더 다양한 방법과 고급 활용
지금까지 다룬 방법 외에도 Pandas DataFrame에서 행을 삭제하는 다양한 방법과 고급 활용법이 있습니다.
isin()을 활용한 더 상세한 조건
- 여러 값 중 하나라도 포함된 행 삭제:
# column2에 'a' 또는 'c'가 포함된 행 삭제
df = df[~df['column2'].isin(['a', 'c'])]
- 특정 리스트에 포함된 값만 남기기:
# column1의 값이 [1, 3, 5]에 포함된 행만 남기기
df = df[df['column1'].isin([1, 3, 5])]
between()을 활용한 범위 조건
- 특정 범위 내의 값을 가진 행만 남기기:
# column1의 값이 2와 4 사이인 행만 남기기
df = df[df['column1'].between(2, 4)]
str 메서드 활용 (문자열 데이터 처리)
- 문자열 패턴 매칭:
# column2의 값이 'a'로 시작하는 행만 남기기
df = df[df['column2'].str.startswith('a')]
복합 조건
- 여러 조건을 and, or 연산자로 결합:
# column1이 2보다 크고 column2가 'c'인 행만 남기기
df = df[(df['column1'] > 2) & (df['column2'] == 'c')]
함수 적용
- 복잡한 조건을 함수로 정의하여 적용:
def complex_condition(row):
return row['A'] > 2 and row['B'] < 45 and row['C'] == 'Y'
df = df[df.apply(complex_condition, axis=1)]
query() 메서드의 고급 활용
- @ 변수 활용:
threshold = 30
df = df.query('B > @threshold')
numpy 함수 활용
- 벡터화 연산:
import numpy as np
# column1의 값이 3의 배수인 행 삭제
df = df[~np.isin(df['column1'], np.arange(3, df['column1'].max()+1, 3))]
그룹화 후 삭제
- 특정 그룹 내의 행 삭제:
# column2를 기준으로 그룹화하여, 각 그룹에서 첫 번째 행만 남기기
df = df.groupby('column2').head(1)
어떤 방법을 선택할지는 데이터의 특성과 원하는 결과에 따라 달라집니다.
- "특정 열의 값이 특정 범위 내에 있으면서, 다른 열의 값이 특정 문자열로 시작하는 행을 삭제하고 싶습니다."
- "그룹별로 통계를 계산한 후, 특정 조건에 맞지 않는 그룹을 삭제하고 싶습니다."
위의 예시 코드들을 바탕으로 자신에게 맞는 코드를 작성해보세요. 필요한 경우 더 자세한 설명을 요청해주세요.
주의:
자주 사용되는 메서드 요약:
- drop(): 특정 행이나 열 삭제
- isin(): 특정 값이 포함된 행 선택
- between(): 특정 범위 내의 값을 가진 행 선택
- query(): SQL과 유사한 문법으로 필터링
- apply(): 각 행 또는 열에 함수 적용
- dropna(): NaN 값이 있는 행 삭제
- groupby(): 데이터 그룹화
python pandas