Pandas - [2단계] 데이터 선택/추출/슬라이싱

c.haha.e·2025년 8월 12일

STUDY

목록 보기
4/27

데이터 선택/추출/슬라이싱


1. 단일/복수 열(컬럼) 선택

(1) 단일 컬럼 선택

  • 방법: df['컬럼명']
  • 반환: Series
import pandas as pd
df = pd.DataFrame({
    '이름': ['홍길동', '이순신', '강감찬'],
    '나이': [25, 31, 29],
    '점수': [90, 85, 95]
})

print(df['이름'])
# 0    홍길동
# 1    이순신
# 2    강감찬
# Name: 이름, dtype: object

(2) 복수 컬럼 선택

  • 방법: df[['컬럼1', '컬럼2']]
  • 반환: DataFrame

print(df[['이름', '점수']])
#      이름  점수
# 0   홍길동  90
# 1   이순신  85
# 2   강감찬  95

실무팁:

  • 컬럼 이름에 띄어쓰기나 특수문자가 있으면 반드시 대괄호([])로 호출해야 함
  • 컬럼을 변수로 받을 때도 리스트로

2. 행 인덱싱 (loc, iloc 차이와 활용법)

(1) loc – 라벨 기반 인덱싱

  • 인덱스/컬럼 이름(label) 기준으로 선택
  • 슬라이싱 시 끝도 포함 (파이썬 슬라이싱과 다름!)

df.index = ['a', 'b', 'c']  # 인덱스를 문자로 바꿨을 때
print(df.loc['a'])          # 'a' 행 반환 (Series)
print(df.loc[['a', 'c']])   # 'a', 'c' 행 반환 (DataFrame)
print(df.loc['a':'c'])      # 슬라이싱 시 'c'까지 포함

# 행+열 동시 선택
print(df.loc['a', '이름'])           # 홍길동
print(df.loc['a':'b', ['이름','점수']])

(2) iloc – 정수 위치 기반 인덱싱

  • 행/열의 순서(숫자 index) 기준
  • 슬라이싱은 파이썬과 동일 (끝 미포함)

print(df.iloc[0])           # 0번째 행
print(df.iloc[[0,2]])       # 0, 2번째 행
print(df.iloc[0:2])         # 0, 1번째 행 (2번째는 포함X)

# 행+열 동시 선택
print(df.iloc[0, 1])        # 0번째 행, 1번째 열
print(df.iloc[0:2, 1:3])    # 0~1행, 1~2열

loc vs iloc 차이 정리

구분lociloc
기준라벨(이름)순서(숫자)
슬라이스끝 포함끝 미포함
예시df.loc['a']df.iloc[0]

3. 조건 필터링 (Boolean Indexing)

  • 특정 조건에 맞는 행만 뽑아내는 것

# 나이가 30 이상인 사람만
print(df[df['나이'] >= 30])

# 이름이 '홍길동'인 행만
print(df[df['이름'] == '홍길동'])

# 여러 조건 조합 (&: and, |: or)
print(df[(df['나이'] > 25) & (df['점수'] > 90)])

주의: AND는 &, OR는 | 조건식 전체는 반드시 소괄호로 감싸야 함!

4. 슬라이싱 (.loc, .iloc)

  • 행, 열의 범위를 지정해서 선택

(1) loc로 슬라이싱


# 행 인덱스 a~b, 컬럼 '이름', '나이'
print(df.loc['a':'b', ['이름','나이']])
  • 끝도 포함

(2) iloc로 슬라이싱


# 0~1번째 행, 0~1번째 열
print(df.iloc[0:2, 0:2])
  • 끝 미포함

5. 행/열 추가, 삭제

(1) 행 추가

  • 새로운 데이터(Series 또는 dict)를 추가
# 한 행 추가 (ignore_index=True로 기존 인덱스 무시하고 새로 부여)

df2 = pd.concat([df, pd.DataFrame([{'이름':'김철수','나이':28,'점수':88}])], ignore_index=True)
print(df2)
  • 또는, 직접 할당(비추! 실무에서는 concat 추천)
  • 실습 때 오류 난 부분
    # df2 = pd.concat([df, pd.DataFrame({'이름':'김철수', '나이':28, '점수':88})], ignore_index = True)   ->  에러남
    
    # 방식 1
    df2 = pd.concat([df, pd.DataFrame({'이름':['김철수'], '나이':[28], '점수':[88]})], ignore_index = True) 
    
    # 방식 2
    df2 = pd.concat([df, pd.DataFrame([{'이름':'김철수','나이':28,'점수':88}])], ignore_index=True)
    • 값이 스칼라(단일값)이면 에러가 남 Pandas는 각 컬럼에 대해 리스트(시퀀스) 형태를 기대
    • 방식 1 로 하면 "1개의 행"을 가진 DataFrame이 만들어져서 pd.concat으로 기존 df에 문제없이 추가 가능
    • 방식 2 는 대괄호 [ ... ]로 딕셔너리를 감싸서 → "딕셔너리의 리스트" 형태로 전달 이렇게 하면 Pandas는 → "딕셔너리 하나 = 데이터 한 행" → 딕셔너리의 key가 컬럼명, value가 해당 값 즉, 1개의 row(행)를 가진 DataFrame으로 인식
    • 보통은 방식 2를 많이 사용함.

(2) 열(컬럼) 추가

  • 새로운 컬럼에 값 할당 (브로드캐스팅/리스트/계산식 등)

df['합격여부'] = df['점수'] >= 90
print(df)

(3) assign() 메서드 활용

  • 여러 새 컬럼을 체이닝(연속) 해서 추가 가능 (원본은 유지)

df2 = df.assign(평가=lambda x: x['점수'].apply(lambda s: 'A' if s>=90 else 'B'))
print(df2)
  • assign() 함수, apply() 함수

    assign() 함수

    • DataFrame에 새로운 컬럼(파생변수)을 추가하고 싶을 때 사용

    • 원본 DataFrame은 변하지 않고, 새 DataFrame을 반환

      (즉, 원본 `df`는 그대로고, `df2`에 결과가 들어감)

      사용법

      df2 = df.assign(새컬럼이름=값 또는 함수)
    • 새컬럼이름은 새로 만들 컬럼의 이름

    • 키워드 인자 형태이기 때문에 ‘ ’ 로 감싸지 않아도 됨.

    • 값 또는 함수를 넣을 수 있음 (대부분 함수를 많이 씀)


      apply() 함수

    • Series(컬럼) 또는 DataFrame에

      각 행/각 값별로 "함수"를 적용하는 메서드

    • *즉, 반복문 없이도 "일괄적으로 가공"**할 수 있음

      사용법

      df['컬럼명'].apply(함수)
    • 함수는 직접 정의한 것도, lambda(람다)도 가능!


(4) 행/열 삭제: drop()

  • 행 삭제: df.drop(index=) / df.drop(행이름, axis=0)
  • 열 삭제: df.drop(columns=) / df.drop(열이름, axis=1)

# 'a' 인덱스(행) 삭제
df1 = df.drop(index='a')
df.drop('a', axis=0)         # 0번 인덱스 행 삭제 위와 같은 의미

df.drop(['a', 'c'], axis=0)    # a, b번 인덱스 행 삭제
df.drop(index=['a', 'c'])      # 같은 의미

# '점수' 컬럼 삭제
df2 = df.drop(columns='점수')

df.drop('이름', axis=1)           # '이름' 열 삭제
df.drop(columns='이름')           # 같은 의미

df.drop(['이름','점수'], axis=1)  # 여러 열 삭제
df.drop(columns=['이름','점수'])  # 같은 의미

# 여러 개 삭제
df3 = df.drop(index=['a','c'], columns=['점수'])

실무팁:

  • drop()은 기본적으로 복사본 반환.
  • 원본 변경은 inplace=True 옵션
    df.drop(columns='점수', inplace=True)

요약 표

선택/추출사용법반환
단일 열 선택df['col']Series
복수 열 선택df[['col1', 'col2']]DataFrame
행(label) 선택df.loc['a'], df.loc[['a','c']]Series/DataFrame
행(정수) 선택df.iloc[0], df.iloc[[0,2]]Series/DataFrame
행+열 동시 선택df.loc['a','col'] / df.iloc[0,1]값(스칼라)
슬라이싱df.loc['a':'c', ['col1']], df.iloc[0:2, 1:3]DataFrame
조건 필터링df[df['col']>값]DataFrame
행/열 추가df['새컬럼'] = 값, assign()DataFrame
행/열 삭제drop(index=...), drop(columns=...)DataFrame
profile
기록용 블로그

0개의 댓글