[판다스 8화] 컬럼 추가·수정·삭제하기: assign과 drop 실무 활용법 | Python Pandas | 빅분기, 빅데이터분석기사 실기

파이썬(Python) 판다스(Pandas)를 활용하여 외부 데이터를 불러오고 필터링하는 방법을 익혔다면, 그다음 단계는 본격적으로 데이터를 목적에 맞게 가공하는 것입니다. 정형 데이터 분석 프로젝트나 빅데이터분석기사(빅분기) 실기 시험에서는 주어진 원본 데이터 열(Column)을 그대로 사용하기보다 파생 변수를 새로 만들거나 불필요한 열을 제거해야 하는 상황이 빈번하게 발생합니다.

판다스에서 데이터프레임의 열을 다루는 방법은 여러 가지가 있지만, 실무와 시험에서 가장 널리 쓰이는 효율적인 도구는 파생 변수를 생성하는 assign() 함수와 불필요한 열을 제거하는 drop() 함수입니다. 이번 글에서는 컬럼의 추가, 수정, 삭제 기법을 비즈니스 가상 데이터 예시와 함께 상세히 정리해 보겠습니다.

1. 데이터프레임에 새로운 열 추가 및 수정하기

판다스에서 컬럼을 추가하거나 수정하는 방식은 크게 ‘대괄호 문법’을 사용하는 방식과 명시적으로 함수를 호출하는 assign() 방식으로 구분됩니다.

1.1. 전통적인 대괄호(df['새컬럼']) 문법

가장 직관적인 방법은 존재하지 않는 컬럼 이름을 대괄호 내부에 지정하고 값을 대입하는 것입니다. 기존에 존재하는 컬럼 이름을 사용하면 내부 데이터가 새로운 값으로 갱신(수정)됩니다.

import pandas as pd

# 가상 매출 데이터 생성
mart_df = pd.DataFrame({
    '상품명': ['사과', '배', '바나나', '포도'],
    '원가': [1000, 2500, 1500, 3000],
    '판매가': [1500, 3200, 2000, 4500]
})

# 1. 새로운 컬럼 추가 (할인율 기본값 0 대입)
mart_df['할인율'] = 0

# 2. 기존 컬럼을 활용한 파생 변수 추가 (이익 계산)
mart_df['이익'] = mart_df['판매가'] - mart_df['원가']

이 방식은 간단한 연산에서는 편리하지만, 원본 데이터프레임이 직접 변경(In-place)되므로 코드가 길어질 때 의도치 않은 데이터 오염을 유발할 수 있습니다.

1.2. 메서드 체이닝을 위한 assign() 함수 활용법

assign() 함수는 원본 데이터를 직접 수정하지 않고, 새로운 컬럼이 추가된 새로운 데이터프레임 객체를 반환합니다. 이 방식은 함수를 연속으로 연결하여 사용하는 ‘메서드 체이닝(Method Chaining)’에 적합하여 실무 코드의 가독성을 높여 줍니다.

# assign을 활용한 파생 변수 생성 (원본 mart_df는 유지됨)
updated_mart = mart_df.assign(
    이익률 = (mart_df['판매가'] - mart_df['원가']) / mart_df['판매가'],
    과세여부 = '과세'
)

assign() 함수 내부에서는 쉼표(,)를 기준으로 여러 개의 컬럼을 한 번에 정의할 수 있으며, 람다(lambda) 함수를 결합하면 이전 단계에서 생성된 컬럼을 참조하여 연쇄적인 계산을 수행할 수도 있습니다.

2. 불필요한 열 삭제하기: drop() 함수 완전 정복

데이터 분석을 진행하다 보면 고유 식별자(ID), 중복된 텍스트 정보 등 예측 모델이나 통계 분석에 기여하지 못하는 컬럼을 제거해야 합니다. 이때 사용하는 핵심 함수가 바로 drop()입니다.

2.1. drop() 함수의 핵심 파라미터 구조

drop() 함수를 사용할 때 가장 실수가 잦은 부분은 행을 지울지 열을 지울지 결정하는 축(axis) 설정입니다.

기본적인 열 삭제 형식은 다음과 같습니다. df.drop(labels=['삭제할컬럼1', '삭제할컬럼2'], axis=1)

  • labels: 삭제하고자 하는 컬럼명(또는 행 인덱스)을 단일 문자열이나 리스트 형태로 지정합니다.
  • axis: 삭제의 방향성을 결정합니다. axis=1 또는 axis='columns'로 지정해야 세로축인 컬럼이 삭제됩니다. (기본값인 axis=0은 가로축인 행을 삭제합니다.)
  • inplace: True로 지정하면 원본 데이터프레임을 직접 변경하고 None을 반환합니다. 지정하지 않으면(기본값 False) 삭제가 적용된 새로운 복사본 객체를 반환합니다.

2.2. 비즈니스 예시로 보는 drop 활용

앞서 가공한 updated_mart 데이터프레임에서 ‘원가’ 컬럼과 ‘과세여부’ 컬럼을 동시에 제거해 보겠습니다.

# 여러 개의 열을 리스트로 묶어 삭제 처리 (axis=1 필수)
clean_mart = updated_mart.drop(labels=['원가', '과세여부'], axis=1)

이 연산을 거치면 clean_mart 객체에는 원가와 과세여부를 제외한 컬럼들만 남게 되며, 머신러닝 모델에 사용할 피처(Feature) 집합을 정제할 때 자주 활용됩니다.

3. 실무 환경에서의 데이터 변환 유의사항 및 예외 처리

데이터를 추가하거나 삭제할 때 파이썬 엔진 내부의 메모리 할당 방식 때문에 경고 메시지가 출력되거나 연산 오류가 발생할 수 있습니다.

3.1. SettingWithCopyWarning 경고 메시지 대응

불리언 인덱싱 등으로 추출한 서브셋 데이터프레임에 대괄호 문법으로 컬럼을 추가하려고 하면 아래와 같은 경고를 만나기 쉽습니다. SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.

이는 현재 다루는 객체가 원본 데이터프레임의 뷰(View)인지 복사본(Copy)인지 판다스가 명확하게 판단할 수 없는 상태에서 값을 변경하려 할 때 발생하는 경고입니다. 복사본을 명시하는 .copy() 메서드를 붙여서 독립적인 메모리 공간을 확보하거나, 앞서 배운 assign() 함수를 사용하면 해당 경고를 사전에 방지할 수 있습니다.

# 경고 방지를 위한 명시적 복사
sub_df = mart_df[mart_df['판매가'] >= 2000].copy()
sub_df['고가상품'] = True

3.2. 컬럼이 존재하지 않을 때의 KeyError 방지

drop() 함수를 실행할 때 데이터프레임에 존재하지 않는 컬럼명을 명시하면 KeyError가 발생하며 프로그램이 중단됩니다. 대용량 스크립트 파이프라인을 짤 때는 errors='ignore' 파라미터를 추가하여 해당 컬럼이 없을 경우 에러를 내지 않고 매끄럽게 넘어가도록 제어할 수 있습니다.

# 존재하지 않는 컬럼이 있어도 에러 없이 실행됨
df_safe = mart_df.drop(labels=['없는컬럼'], axis=1, errors='ignore')

4. 빅데이터분석기사 실기 시험 환경에서의 실전 활용 포인트

빅데이터분석기사 실기 시험(작업형 제2유형)의 핵심은 수많은 독립변수 데이터를 가공하여 모델의 예측력을 높이는 것입니다. 이 과정에서 컬럼 조작 기술은 다음과 같은 워크플로우로 집약됩니다.

4.1. 파생 변수 생성을 통한 데이터 고도화

고객의 주간 구매 횟수와 평균 구매 금액이 컬럼으로 주어졌을 때, 총구매액 파생 변수를 생성하여 모델의 학습 데이터로 기여하게 만듭니다.

# 시험용 파생 변수 생성 예시
X_train['총구매액'] = X_train['주간구매횟수'] * X_train['평균구매금액']

4.2. 불필요한 식별자(ID) 제거

대부분의 빅분기 시험 데이터셋에는 ‘Cust_ID’나 ‘Index_No’와 같이 예측 모델에는 아무런 변별력이 없지만 채점 시 매칭을 위해 필요한 고유 식별 번호가 포함되어 있습니다. 예측에 도움이 되지 않는 식별자 변수이므로 일반적으로 모델 학습 전에 제거하는 것이 좋습니다. 그대로 사용할 경우 모델 성능에 불필요한 영향을 줄 수 있습니다.

# 예측에 방해되는 고유 ID 열 제거하기
# 최종 제출용 생성을 위해 원본 ID 변수는 상단에 따로 백업해 두어야 합니다.
cust_id_backup = X_test['Cust_ID']
X_train_clean = X_train.drop(labels=['Cust_ID'], axis=1)
X_test_clean = X_test.drop(labels=['Cust_ID'], axis=1)

이와 같이 분석의 흐름에 맞춰 알맞은 시점에 열 데이터를 삽입하고 제거하는 처리는 시험 점수를 안정적으로 확보하는 핵심 능력입니다.

5. 요약 및 다음 화 안내

  • 컬럼 추가/수정: 대괄호 문법(df['col'] = value)은 원본을 직접 변형하며, assign() 함수는 메서드 체이닝에 최적화된 새로운 객체를 반환합니다.
  • 컬럼 삭제: drop() 함수를 사용하며, 세로축 열을 지우기 위해 axis=1 옵션을 명시해야 합니다. 안정적인 데이터 유지 관리를 위해 inplace=True 사용은 신중하게 결정하는 것이 좋습니다.
  • 예외 관리: 메모리 참조 경고 방지를 위해 .copy()를 활용하고, 구조적 누락 대응을 위해 errors='ignore' 옵션을 참고할 수 있습니다.

다음 [판다스 9화]에서는 정제된 데이터프레임 내부의 순서를 특정 기준에 맞추어 재정렬하고 각 데이터 간의 격차를 비교하기 위한 데이터 정렬과 순위 계산하기(sort_values, rank) 실전 예제에 대해 학습해 보겠습니다. 데이터를 원하는 기준으로 정렬하고 순위를 계산하여 분석에 활용하는 방법을 자세히 살펴보겠습니다.

댓글 남기기