1학년 2학기/머신러닝원리와 응용

[2강_off] Pandas

seungyeonworld 2025. 3. 29. 12:39

[1. Pandas]

 

1.pandas 소개

  1. 구조적 데이터의 표현과 처리에 적합함
  2. 다양한 포멧으로 저장된 데이터 접근 및 효율적인 분석/ 처리 가능
    1. CSV, Excel, RDB 등 다양한 입력 형식 지원
    2. 데이터 입력 및 출력 용이
    3. 데이터 가공과 필터링, 그룹화
    4. 통계 및 데이터 분석과 시각화 지원
  • pandas 설치 및 사용
    • Colab에는 기본 설치되어 있음
    • import pandas as pd
    • 예시: pd.Series([1,3,5,12])

 

2.pandas 의 데이터 타입

  • 시리즈(Series): 1차원 데이터 구조, 1차원 라인 그래프 형태로 데이터를 시각화 가능
  • 데이터프레임(DataFrame): 2차원 데이터 구조, 표 형태로 나타
  • 패널(Panel): 3차원 데이터 구조 (현재는 거의 사용되지 않음)
  • 4차원 이상의 데이터: Panel4D, NA값을 포함한 데이터: PanelNDE 등 실험적으로 사용됨

 


[2. Pandas_Series]

 

1.pandas 의 Series 란?

  • 1차원 데이터를 저장하기 위한 데이터 구조
  • 마치 리스트나 배열처럼 동작하지만, 인덱스를 지정할 수 있다는 점이 특징
    (리스트는 자동으로 0,1,2~의 인덱스가 지정되지만, Series는 원하는 값으로 인덱스를 지정가능-문자도 가능!)
    (** 배열 : 같은 종류의 데이터를 순서대로 저장하는 데이터 구조
    ** 리스트 : 여러 자료형을 섞을수 있음)
  • 시리즈는 pd.Series() 함수로 생성
  • 각 요소에 인덱스를 부여하며, 인덱스는 기본적으로 0부터 시작하지만, 직접 지정도 가능

2. Series의 특징

 

  • 데이터 타입 제한 없음
    • 숫자, 문자열, NaN 등 다양한 데이터 타입을 혼합하여 담을 수 있
    • 내부적으로는 Numpy의 ndarray 형태로 저장됨
      (Series는 인덱스와 값이 있는 표처럼 생겼지만, 실제 데이터를 담고 있는 구조는 numpy의 배열(ndarray)임!)
    • dtype을 통해 데이터 타입 확인 가능

 

 

3. 라인 레이블(인덱스) 지정 방법

  • 인덱스는 정수형, 문자형 등 다양한 형태로 지정 가능하며 중복이 있어도 상관없음 (단, 혼동될 수 있으니 주의 필요)
  • 라인 레이블은 1씩 증가할 필요가 없으며 단조 증가할 필요가 없다.
  • 인덱스의 길이와 값의 개수가 일치하면 사용 가능
     
    ex) pd.Series([1,2,3], index=['a','b','c'])
  • 딕셔너리 타입 리터럴을 인자로 넘길 수 있음

 

4. 라인 레이블(인덱스) 값 접근

  • 처음생성할때에는 0,1,2,3`` 처럼 인덱스가 자동으로 부여된다.

 

  • dat.index = [...] 로 인덱스를 한 번에 바꿔줄 수도 있다. (데이터는 그대로 유지하며, 레이블만변경)

  • loc[ ] : 레이블 인덱스에 의한 데이터 접근 (레이블이름으로 해당 레이블의 값을 반환)

  • iloc[ ] : 순서 인덱스를 이용한 접근 (정수위치 기반 접근방식) 
    >> 0부터 시작함
    >> 중복된 레이블이 있는경우에도 문제없이 원하는 데이터에 접근이 가능

 

4. 계층형 인덱스 (값이 아니고 인덱스를 2개 이상으로!!!!)

    • 인덱스를 다중단계로 설정하여 축에 대해 다중 (둘 이상) 색인단계를 지정할 수 있도록 해준다.
    • 고차원 데이터를 저차원 형식으로 다룰 수 있게 해준다.
      >>  panel이나 panel4D와 같은 데이터 타입을 사용하지 않고 Series 혹은 DataFrame으로 고차원데이터 표현 가능
    • 복잡한 데이터를 구조화해서 저장이 가능하며 패널데이터, 시계열, 그룹분석등에 매우 유용하다.

 

 

[3. Pandas_DataFrame]

 

1.pandas 의 DataFrame 이란?

  • 2차원 데이터 구조로 Pandas에서 가장 많이 사용되는 데이터 타입
    >> 로우 레이블(index)와 칼럼 테이블(columns)을 지정할 수 있음
  • Series가 1차원(열 하나짜리 표)이라면, DataFrame은 여러 Series가 모인 2차원 표인 것
  • 스프레드시트(엑셀) 혹은 SQL 테이블과 유사한 모습
  • 다양한 데이터 타입 저장가능
    >> 딕셔너리 타입 : 리스트 / 튜플 / 시퀀스 타입 / 시리즈 / 딕셔너리를 값으로 갖는 것
    >> 리스트 : 딕셔너리,  시리즈, 리스트, 튜플을 요소로 갖는 리스트
    >> 데이터프레임 : 데이터프레임에 얕은 복사로 사본이 생성
    >> NumPy의 2차원 ndarray : 데이터프레임은 2차원 이므로 2차원 배열을 데이터프레임으로 변환 가능
  • 구조 :

 

 

2. 다양한 형식에서 DataFrame 생성하기

  • 딕셔너리 → DataFrame
    >> 버전에 따라 자동정렬로 인해 순서가 바뀔 수 있으므로 처음 생성 시 인자에서의 순서와 달라질수 있으므로 주의!


   

        >> 칼럼순서를 명시하고 싶을경우 columns 인자를 사용하여
            columns=["성별", "이름", "나이"]처럼 순서를 명시적으로 지정하면 사용가능!

 

 

            >> 단, columns인자를 사용해 명시된 칼럼이 데이터프레임에 없을경우, NaN반환!

 

 

 

 

  • Numpy 2차원 배열 → DataFrame

 

  • DataFrame  → Series : 데이터프레임의 한 칼럼을 시리즈로 변환
    >> s1 = 데이터프레임객체.칼럼명 : 공백,한글,특수문자,파이썬예약어일 경우 사용불가
    >> s2 = 데이터프레임객체['칼럼명'] : 한글, 공백, 특수문자 모두 ok

 


3. 칼럼 지정 방법

  • colums 인자를 사용해 생성시 지정하는 방법

  • .colums 속성을 사용하여 나중에 이름 바꾸는 방법 (초기에 미설정시 0부터 숫자로 자동설정된다.)


4. DataFrame의 계층형 인덱스

  • 인덱스 또는 칼럼에  2단계 이상의 구조를 부여할 수 있는 기능
  • 일반적인 인덱스 / 칼럼은 단일 이름이지만, 계층형 인덱스는 튜플 형태로 되어 있음
  • Series에서도 쓸 수 있지만, DataFrame에서는 행과 열 모두 계층형으로 만들 수 있음

 

 

  • 계층형인덱스 접근방법

    >> frame.loc[('a', 1)] : ('a', 1)이라는 인덱스에 해당하는 행 전체를 가져옴

    >> frame['Ohio']['Green'] : "Ohio"라는 1단계 컬럼 전체를 가져온 후 "Green"이라는 칼럼 가지고옴

 

 

5. DataFrame의 사칙연산

  • Series와 DataFrame 객체끼리는 * + - / 등의 사칙연산이 가능
  • 연산시 인덱스와 칼럼이름을 기준으로 정렬 후 연산
  • 서로 크기가 달라도 연산이 가능하지만, 일치하지 않는 부분은 NaN (결측값) 반환

    >> Series 간의 사칙연산

 

  >> DataFrame 간의 사칙연산 

 

[4. 데이터 선택하기]

 

1.기본정보 확인하는 함수

 

2. 인덱스를 이용한 행 선택  (iloc = 숫자기반, loc = 라벨기반)

  • 정수 위치 기반 ".iloc[ ]"
    >> df.iloc[0] : 첫번째 행
    >> df.iloc[0:3] : 0~2번째 행 슬라이싱

  • 레이블(이름)기반 ".loc[ ]"
    >>  df.loc["서울"] : "서울"이라는 행 
    >> df.loc[["행이름1":"행이름3"]] : 여러 행 선택

 

3. 열 선택  (iloc, loc은 행을 선택할때 쓰는거임! 열 선택할땐 쓰지 않는다.)

  • 단일 열 선택 (Series변환) 
    >> df [ "열이름" ] 
  • 여러 열 선택 (DataFrame 변환)
    >> df [ [ "열이름1" , "열이름2" ] ]

★df [ "열" ] 과 df [ ["열"] ]은 반환 타입이 다르다.    (앞은 Series 반환, 뒤는 DataFrame 반환)

 

★ df.iloc[1, 3] : 두번째 행, 4번째 열을 가져오라는 의미 (0부터시작)

★df.iloc[[1, 3]]) : 1행과 3행 와 모든 열을 가져옴

★df.iloc[:, [1, 3]] : 모든행에서 1열과 3열만 가져옴

★단, 슬라이싱 문법은 리스트안에 넣으면 파이썬이 인식을 못함
       => df.iloc[[1:3]], df.iloc[:,[1:3]] 불가

      => df.iloc [ 1:3, 0:2] 는 가능! (행 : 2~3행/ 열: 1~2열 // 0부터 시작)

      => df.iloc[:, 1:4]는 가능!        (행:전)체 / 열 : 2열~4열 // 0부터 시작)

 


4. 행과 열을 동시에 선택

  • df.loc["서울", "여름"]                          # 서울 행의 여름 열 값
  • f.loc["서울", ["봄", "가을"]]                  # 서울 행의 일부 열
  • df.loc[["서울", "부산"], ["봄", "여름"]]  # 여러 행, 여러 열 (반드시 리스트안에 담아주기 안그러면 튜플로 인식하여 에러!)

 

5. 조건 기반 선택

  • df[df["봄"] > 250]
    >> 봄 열의 값이 250보다 큰 행만 추출
  • df[(df["여름"] > 300) & (df["겨울"] < 200)]
    >> 여름열의 값이 300보다 크면서 겨울열의 값이 200보다 작은 행 추출
    >> 여러 조건 조합도 가능 (&, |, 괄호 필수!)

=================================================================

 

 

[5. 데이터 통합하기]

 

1.두 개의 데이터를 하나로 통합하기

  • 세로로 증가하는 방향으로 병합 (index 증가)  "concat"
    >> pd.concat ( [dataframe1, dataframe2])
  • 가로로 증가하는 방향으로 병합 (columns 증가) : "join"
    >> dataframe1.join(dataframe2)
  • 공통된 열 (key)를 중심으로 좌우로 병합 : "merge"
    >> dataframe1.merge(dataframe2)

2.세로 방향 병합

  • pd.concat ( [df1], [df2] ) : 각 데이터 프레임의 기존 인덱스 그대로 통합
  • pd.concat  ( [df1], [df2] ,ignore_index = True) : 각 데이터 프레임의 기존 인덱스들은 무시되고 새로 0부터 인덱싱
  • concat은 열의 이름을 기준으로 자동으로 맞춰서 정렬하는데, 만약 concat한 객체중 없는 열이 있다면 해당 값은 자동으로 NaN으로 채워짐

 

3. 가로 방향 병합

  • dataframe1.join(dataframe2) : 인덱스 라벨을 이용하여, 같은 인덱스끼리 가로 방향으로 데이터 추가
    >> 인덱스가 다르다면 NaN 반환 
    >> 인덱스 중심으로 합친다는 것을 꼭 기억하기
    >> 내부적으로는 merge(left_index=True, right_index=True) 와 비슷 (merge함수는 같은 열값을 붙이는데, 이건 인덱스가 같은 행을 붙이라는 의미임!)

4. 데이터 통합

  • dataframe1.merge(dataframe2) : rhdxh
    >> 공통된 열의 값을 기준으로 병합 (공통된 인덱스 x)
    >> 열의 값이 같은 행끼리 붙는 것을 의미
  • df1.merge(df2, how = merge_method, on = key_label)
    >> on에는 키 열을 지정
    >> how 선택인자