Skip to content

Pandas 열 삭제: DataFrame에서 열을 제거하는 방법

Updated on

실제 데이터 소스에서 가져온 DataFrame에는 필요한 열만 포함되어 있는 경우가 거의 없습니다. CSV 내보내기에는 메타데이터 열이 포함되고, 데이터베이스 쿼리는 추가 필드를 가져오며, API 응답에는 이미 평탄화한 중첩 데이터가 포함됩니다. 의미 있는 분석을 수행하기 전에 관련 없는 열을 제거해야 합니다. 이를 잘못 수행하면 -- 실수로 잘못된 열을 삭제하거나 복사본을 만들려던 것이 원본 DataFrame을 수정하게 되면 -- 추적하기 어려운 데이터 손실 버그가 발생합니다.

Pandas는 각각 다른 상황에 적합한 여러 가지 열 제거 방법을 제공합니다. drop() 메서드가 가장 다재다능하지만, del, pop() 및 열 선택도 유용한 대안입니다. 이 가이드는 각 접근 방식을 언제 사용해야 하는지 명확한 예제와 함께 다룹니다.

📚

df.drop() 사용하기 -- 표준 접근법

drop() 메서드는 열을 제거하는 주요 방법입니다. 열 이름을 전달하고 axis=1을 설정하거나 columns 매개변수를 사용합니다.

단일 열 삭제

import pandas as pd
 
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [25, 30, 35],
    'salary': [50000, 60000, 70000],
    'department': ['Engineering', 'Marketing', 'Sales'],
})
 
# 방법 1: columns 매개변수 사용 (권장)
df_clean = df.drop(columns=['salary'])
print(df_clean)
 
# 방법 2: axis=1 사용
df_clean = df.drop('salary', axis=1)

여러 열 삭제

import pandas as pd
 
df = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie'],
    'email': ['a@test.com', 'b@test.com', 'c@test.com'],
    'temp_col': [None, None, None],
    'internal_id': ['X1', 'X2', 'X3'],
})
 
# 여러 열을 한 번에 삭제
df_clean = df.drop(columns=['temp_col', 'internal_id', 'email'])
print(df_clean)
#    id     name
# 0   1    Alice
# 1   2      Bob
# 2   3  Charlie

inplace 매개변수

기본적으로 drop()은 새로운 DataFrame을 반환합니다. 원본을 수정하려면 inplace=True를 사용합니다:

import pandas as pd
 
df = pd.DataFrame({'a': [1], 'b': [2], 'c': [3]})
 
# 새로운 DataFrame 반환 (원본 변경 없음)
new_df = df.drop(columns=['b'])
print(df.columns.tolist())      # ['a', 'b', 'c'] (변경 없음)
print(new_df.columns.tolist())  # ['a', 'c']
 
# 원본 DataFrame 수정
df.drop(columns=['b'], inplace=True)
print(df.columns.tolist())  # ['a', 'c']

errors 매개변수로 없는 열 처리

import pandas as pd
 
df = pd.DataFrame({'a': [1], 'b': [2], 'c': [3]})
 
# 기본값: 열이 없으면 KeyError 발생
# df.drop(columns=['d'])  # KeyError: "['d'] not found in axis"
 
# 없는 열 무시
df_clean = df.drop(columns=['b', 'd'], errors='ignore')
print(df_clean.columns.tolist())  # ['a', 'c']

del 문 사용하기

del 문은 열을 제자리(in-place)에서 삭제합니다. 간결하지만 한 번에 하나의 열로 제한됩니다.

import pandas as pd
 
df = pd.DataFrame({'a': [1, 2], 'b': [3, 4], 'c': [5, 6]})
 
del df['b']
print(df.columns.tolist())  # ['a', 'c']

제한사항: 여러 열을 동시에 삭제할 수 없습니다. 없는 열을 무시할 수 없습니다(KeyError 발생). 항상 in-place로 수정합니다.

df.pop() 사용하기

pop()은 열을 삭제하고 Series로 반환합니다. 삭제한 열을 이후에 사용해야 할 때 유용합니다.

import pandas as pd
 
df = pd.DataFrame({
    'name': ['Alice', 'Bob'],
    'target': [1, 0],
    'feature1': [10, 20],
    'feature2': [30, 40],
})
 
# DataFrame에서 삭제하면서 타겟 열 추출
y = df.pop('target')
X = df
 
print(y)
# 0    1
# 1    0
# Name: target, dtype: int64
 
print(X)
#     name  feature1  feature2
# 0  Alice        10        30
# 1    Bob        20        40

열 선택 (삭제의 반대)

제거할 열을 나열하는 것보다 원하는 열을 선택하는 것이 더 쉬울 때가 있습니다.

import pandas as pd
 
df = pd.DataFrame({
    'name': ['Alice', 'Bob'],
    'age': [25, 30],
    'salary': [50000, 60000],
    'dept': ['Eng', 'Mkt'],
    'internal_id': ['X1', 'X2'],
})
 
# 특정 열만 유지
df_clean = df[['name', 'age', 'salary']]
 
# 해당 열을 제외한 모든 것을 선택하여 열 삭제
df_clean = df.loc[:, df.columns != 'internal_id']
 
# 조건에 맞는 열 유지
df_numeric = df.select_dtypes(include='number')
print(df_numeric)
#    age  salary
# 0   25   50000
# 1   30   60000

패턴 또는 조건으로 열 삭제

이름 패턴으로 열 삭제

import pandas as pd
 
df = pd.DataFrame({
    'name': ['Alice'], 'age': [25],
    'temp_1': [None], 'temp_2': [None],
    'internal_flag': [True],
})
 
# 'temp_'로 시작하는 열 삭제
cols_to_drop = [c for c in df.columns if c.startswith('temp_')]
df_clean = df.drop(columns=cols_to_drop)
print(df_clean.columns.tolist())  # ['name', 'age', 'internal_flag']
 
# 'internal'을 포함하는 열 삭제
cols_to_drop = [c for c in df.columns if 'internal' in c]
df_clean = df.drop(columns=cols_to_drop)
 
# filter()를 사용하여 일치하는 열 유지
df_temps = df.filter(like='temp')  # 'temp'를 포함하는 열만 유지
df_no_temps = df.drop(columns=df.filter(like='temp').columns)

데이터 타입으로 열 삭제

import pandas as pd
 
df = pd.DataFrame({
    'name': ['Alice', 'Bob'],
    'age': [25, 30],
    'score': [95.5, 87.3],
    'active': [True, False],
})
 
# 모든 비숫자 열 삭제
df_numeric = df.select_dtypes(include='number')
 
# 모든 object(문자열) 열 삭제
df_no_strings = df.select_dtypes(exclude='object')
print(df_no_strings.columns.tolist())  # ['age', 'score', 'active']

결측값이 너무 많은 열 삭제

import pandas as pd
import numpy as np
 
df = pd.DataFrame({
    'a': [1, 2, 3, 4, 5],
    'b': [1, np.nan, np.nan, np.nan, np.nan],
    'c': [1, 2, np.nan, 4, 5],
    'd': [np.nan, np.nan, np.nan, np.nan, np.nan],
})
 
# 50% 이상의 값이 결측인 열 삭제
threshold = len(df) * 0.5
df_clean = df.dropna(axis=1, thresh=int(threshold))
print(df_clean.columns.tolist())  # ['a', 'c']

메서드 비교

메서드반환값In-Place다중 열없는 열 처리
df.drop(columns=...)새 DataFrame선택적 (inplace)errors='ignore'
del df[col]없음항상아니오 (하나씩)KeyError 발생
df.pop(col)삭제된 Series항상아니오 (하나씩)KeyError 발생
df[cols_to_keep]새 DataFrame아니오예 (역선택)KeyError 발생
df.select_dtypes()새 DataFrame아니오dtype별N/A

정리된 DataFrame 시각화

열을 삭제하고 데이터를 정리한 후, PyGWalker (opens in a new tab)는 Jupyter에서 직접 정리된 DataFrame을 탐색할 수 있는 인터랙티브 Tableau 스타일 인터페이스를 제공합니다:

import pygwalker as pyg
 
# DataFrame 정리 후
walker = pyg.walk(df_clean)

이를 통해 플로팅 코드를 작성하지 않고도 남은 열을 드래그 앤 드롭하여 차트를 만들 수 있습니다.

FAQ

Pandas에서 열을 삭제하려면?

df.drop(columns=['열이름'])을 사용하여 열을 제거하고 새로운 DataFrame을 반환합니다. In-place 삭제에는 inplace=True를 추가합니다. del df['열이름']으로 빠른 in-place 삭제, 또는 df.pop('열이름')으로 열을 제거하고 Series로 반환할 수도 있습니다.

여러 열을 한 번에 삭제하려면?

df.drop(columns=['col1', 'col2', 'col3'])에 열 이름 목록을 전달합니다. 이렇게 하면 지정된 모든 열이 한 번의 작업으로 제거되고 새로운 DataFrame이 반환됩니다.

조건부(패턴이나 데이터 타입)로 열을 삭제하려면?

이름 패턴에는 리스트 컴프리헨션을 사용합니다: df.drop(columns=[c for c in df.columns if c.startswith('temp_')]). 데이터 타입에는 df.select_dtypes(exclude='object')로 문자열 열을 삭제하거나, df.select_dtypes(include='number')로 숫자 열만 유지합니다.

drop()과 del의 차이점은?

df.drop()은 기본적으로 새로운 DataFrame을 반환하고, 여러 열을 동시에 처리할 수 있으며, 없는 열에 대해 errors='ignore' 옵션이 있습니다. del df[col]은 항상 in-place로 수정하고, 한 번에 하나의 열만 처리하며, 열이 없으면 KeyError를 발생시킵니다.

결측값이 있는 열을 삭제하려면?

df.dropna(axis=1)로 NaN이 하나라도 있는 열을 삭제합니다. df.dropna(axis=1, thresh=n)으로 최소 n개의 비null 값을 가진 열만 유지합니다. 사용자 정의 임계값에는 null 비율로 필터링합니다: df.loc[:, df.isnull().mean() < 0.5]는 결측 데이터가 50% 미만인 열을 유지합니다.

결론

대부분의 상황에서 df.drop(columns=[...])이 올바른 선택입니다 -- 명시적이고, 여러 열을 처리하며, 기본적으로 새로운 DataFrame을 반환합니다. 빠른 in-place 단일 열 삭제에는 del을, 삭제한 열이 필요할 때는 pop()을, 제거할 것보다 유지할 것을 지정하는 게 더 쉬울 때는 열 선택이나 select_dtypes()를 사용하세요.

📚