Python to AI

Python - Pandas(데이터 프레임 구조 재조정)

최 수빈 2024. 12. 18. 14:19

 

데이터프레임의 구조를 재조정

 

 

데이터를 원하는 형태로 변형

 

피벗(pivot), 변경(melt), 스택(stack), 언스택(unstack)

 

 

pivot()을 사용한 피벗 테이블 생성

 

pivot()함수는 열 데이터를 행 또는 열로 이동시켜 새로운 데이터프레임을 만듦

-데이터를 재구성하고 분석하는 데 매우 유용

import pandas as pd

#예시 데이터프레임 생성
data = {
    '날짜' : ['2023-01-01', '2023-01-02', 2023-01-01', 2023-01-02'],
    '도시' : ['서울', '서울', '부산', '부산'],
    '온도' : [2, 3, 6, 7],
    '습도' : [55, 60, 80, 85]
    }
df = pd.DataFrame(data)

#'도시'를 기준으로 '날짜'를 인덱스로, '온도'를 값으로 하는 피벗 테이블 생성
pivot_df = df.pivot(index = '날짜', columns = '도시', values = '온도')
print(pivot_df)

 

melt()를 사용한 데이터 구조 해체

 

melt()함수는 피벗된 데이터를 다시 긴 형식(long format)으로 변환할 때 사용됨 - 여러 열을 하나의 열로 통합하는 데 유용

#데이터프레임 구조 해체(melt)
melted_df = pd.melt(df, id_vars = ['날짜','도시'], value_vars = ['온도', '습도']
melted_df

 

stack()과 unstack()을 사용한 데이터 변환

 

stack(): 열 데이터를 인덱스 하위 레벨로 이동

unstack(): 인덱스를 원래 구조로 

-멀티 인덱스 데이터프레임에서 유용

#'도시'레벨을 인덱스로 스택(stack)
stacked_df = pivot_df.stack()
stacked_df

#언스택(unstack)하여 원래 구조로 복원
unstacked_df = stacked_df.unstack()
unstacked_df

 

더보기

stack(), unstack() 사용 시 주의 사항

 

-다중 인덱스의 필요

다중 인덱스가 없는 경우 stack()을 사용할 수 없음

unstack()은 행(Level)을 열로 변환 => DataFrame이 다중 인덱스를 갖고 있지 않으면 제대로 작동하지 않음

df = pd.DataFrame({'A': [1, 2]}, index=['X', 'Y'])
df.unstack()  # ValueError 발생

 

-결과로 Series 반환

기본적으로 stack()은 데이터가 다중 인덱스로 구성된 Series를 반환

만약 DataFrame 형태를 유지하고 싶다면 추가작업 필요 

stacked = df.stack()
stacked.to_frame() #DataFrame 형태로 변환

 

-결측치(Nan) 처리

stack()은 기본적으로 결측치가 있는 열은 제외 하고 변환

unstack()은 변환 과정에서 비어 있는 값이 있는 경우 자동으로 Nan으로 채움 => 데이터의 완결성을 확인해야 함

 

-level 파라미터

변환하고자 하는 열의 수준을 지정해야 할 경우, 다중 레벨의 열을 다룰 때 level 옵션에 주의

df = pd.DataFrame({
    ('A', 'x'): [1, 2],
    ('A', 'y'): [3, 4],
    ('B', 'z'): [5, 6],
}, index=['i', 'j'])
stacked = df.stack(level=0)
print(stacked)

 

 

unstack() 시 특정 레벨의 인덱스만 열로 변환하려면 level을 정확히 지정해야 함

지정하지 않으면 기본적으로 가장 낮은 레벨이 선택됨

 

-정렬된 인덱스 필요

인덱스가 정렬되어 있지 않으면 stack()이나 unstack()이 제대로 작동하지 않을 수 있음

sort_index()를 사용해 정렬

df = df.sort_index() #stack/unstack 전에 정렬

 

 

데이터 프레임 크기 조정하기

 

행과 열의 추가, 삭제, 데이터 병합 등이 있음

데이터를 분석하기에 적합한 형태로 조정

 

 

행과 열 추가하기

 

새로운 열을 추가할 때는 새로운 데이터를 할당한다

df['새로운 열'] = 값

#새로운 열 추가
df['날씨'] = ['맑음', '흐림', '맑음', '흐림']
df

행과 열 삭제하기

 

drop()함수 사용

axis = 0 행

axis = 1 열

#'습도'열 삭제
df_dropped = df.drop(columns = ['습도'])
df_dropped

 

#특정 행 삭제(예: 첫번째 행)
df_dropped_row = df.drop(index=0)
df_drooped_row

 

 

특징 drop del
사용 범위 Pandas DataFrame, Series Python 변수, Pandas DataFrame의 열
행(row) 삭제 가능(axis = 0) 불가능
열(column) 삭제 가능(axis = 1) 가능
원본 수정 여부 기본적으로 원본 유지(inplace = True로 수정 가능) 항상 원본 수정
반환값 새로운 DataFrame 또는 Series 반환값 없음
삭제 대상 이름(labels) 또는 인덱스(index) 변수 또는 열 이름(컬럼만 가능)

 

 

 

데이터 병합

 

concat()

merge()

#새로운 데이터프레임 생성
data2 = {
    '날짜' = ['2023-01-03', '2023-01-04'],
    '도시' = ['서울', '부산'],
    '온도' = [5, 8],
    '습도' = [70, 75],
    '날씨' = ['맑음', '흐림']
    }
df2 = pd.DataFrame(data2)

#행을 기준으로 데이터프레임 병합(concat)
merged_df = pd.concat([df, df2], ignore_index = True)
merged_df

 

=> 새로운 데이터가 병합되어 데이터프레임의 크기가 확장됨

 

특성 concat merge
기능 단순 연결 관계를 고려한 병합(SQL JOIN)
기준 인덱스 또는 축(axis) 공통 열 또는 인덱스
결과 단순히 데이터 이어붙이기 기준에 따라 데이터를 병합
결과 형태 기존 구조를 유지 기준에 따라 새로운 구조 생성
병합 방식 단순 연결(inner, outer 없음) inner, outer, left, right 지원

 

'Python to AI' 카테고리의 다른 글

AI/ML/DL  (1) 2024.12.24
Machine learning Vol.2  (7) 2024.12.17
Python - Pandas(다차원데이터관리 : MultiIndex)  (4) 2024.12.17
Machine learning  (6) 2024.12.16
Python - 객체 탐색과 속성 관리  (4) 2024.12.15