본문으로 건너뛰기
김신건의 로그

[Pandas] 컬럼 선택

· 수정 · 📖 약 1분 · 182자/단어 #python #pandas #selection
Pandas 컬럼, Pandas 열 선택, Pandas 컬럼 선택, df column select

정의

DataFrame 에서 하나 또는 여러 컬럼을 선택 하는 방법들. 가장 기본이자 가장 자주 쓰는 동작.

4 가지 기본 방식

df['name']             # 단일 컬럼 → Series
df[['name']]            # 한 컬럼이지만 DataFrame
df[['name', 'age']]    # 여러 컬럼 → DataFrame
df.name                 # attribute (제한적)

단일 vs 다중 (반환 타입 차이)

python
import pandas as pd
df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]})

x = df['a']             # Series
y = df[['a']]            # DataFrame (한 컬럼)
print(type(x).__name__, type(y).__name__)
print(x.shape, y.shape)
결과
Series DataFrame
(3,) (3, 1)

대괄호 1 개 → Series, 대괄호 2 개 (리스트) → DataFrame.

attribute 접근의 제한

df.name      # ✓ 동작
df.class     # ❌ Python 예약어
df['1st']    # ✓ 동작
df.1st       # ❌ 문법 오류

attribute 는 일관성이 없으므로 df['col'] 권장.

컬럼 순서 변경

df[['c', 'a', 'b']]      # 명시적 순서로 재정렬한 새 DataFrame
df.reindex(columns=['c', 'a', 'b'])  # 같음

패턴으로 선택

# 이름이 'amount_' 로 시작하는 컬럼만
df.filter(like='amount_')

# 정규식
df.filter(regex='^(name|age)$')

# dtype 기반
df.select_dtypes(include='number')
df.select_dtypes(include=['int64', 'float64'])
df.select_dtypes(exclude='object')
python
df = pd.DataFrame({
  'name': ['A', 'B'],
  'age': [20, 30],
  'salary': [3000, 5000],
})
print(df.select_dtypes(include='number').columns.tolist())
print(df.filter(like='a').columns.tolist())
결과
['age', 'salary']
['name', 'age', 'salary']

컬럼 추가 / 삭제

df['bmi'] = df['weight'] / (df['height'] / 100) ** 2
df['constant'] = 100
df = df.drop(columns=['old_col'])
df = df.drop(columns=['a', 'b'])

# in-place 도 가능하지만 권장 안 함
df.drop(columns=['a'], inplace=True)

assign 으로 method chain

df_new = (df
    .assign(bmi=lambda d: d['weight'] / (d['height']/100)**2)
    .assign(category=lambda d: d['bmi'].apply(categorize))
)

체인 방식으로 새 컬럼을 추가, 원본 보존.

컬럼 이름 변경

df.rename(columns={'old_name': 'new_name'})
df.rename(columns=str.lower)              # 모든 컬럼 소문자
df.columns = ['a', 'b', 'c']              # 직접 할당

함정

1. SettingWithCopyWarning

sub = df[df['age'] > 20]
sub['new'] = 1      # ⚠️ SettingWithCopyWarning
# 해법: .copy() 명시
sub = df[df['age'] > 20].copy()
sub['new'] = 1      # ✓

2. attribute 가 메서드와 충돌

df.shape, df.values, df.index 같은 attribute 가 있으면 같은 이름의 컬럼은 attribute 로 못 부른다.

df['shape']    # ✓ 컬럼
df.shape        # DataFrame 의 shape attribute

참고

이 글의 용어 (3개)
[Pandas] .loc / .ilocpandas
정의 - : 라벨 기반 인덱싱 (index/column 이름) - : 정수 위치 기반 인덱싱 (0-based) 이 두 indexer 가 pandas 선택의 표준. 만으로는 헷갈리…
[Pandas] DataFramepandas
정의 은 2차원 레이블 테이블. 각 열이 , 모든 열이 같은 (행 라벨) 를 공유. SQL 테이블 / Excel 시트 / R data.frame 의 Python 대응체. 생성 <…
[Pandas] query / evalpandas
정의 - : 문자열로 boolean 표현식 을 전달해 행 필터링 - : 문자열로 계산 표현식 을 평가 의 가독성 있는 대안. query 기본 긴 조건일수록 query 가 짧고 읽…

이 개념을 다룬 위키 페이지 (2)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기