Pandas 데이터 구조화

TIL Day 15

By polaris0208

Pandas 데이터 구조화

Multi index 생성

  • 하나 이상의 인덱스를 사용, 데이터프레임의 행과 열을 구조화

.set_index([인덱스1, 인덱스2])

import pandas as pd
data = {
    '도시': ['서울', '서울', '부산', '부산'],
    '년도': [2021, 2022, 2021, 2022],
    '인구수': [9700000, 9720000, 3400000, 3450000]
}
df = pd.DataFrame(data)
# .set_index()
df_multi_index = df.set_index(['도시', '년도'])
print(df_multi_index)

pd.MultiIndex.from_tuples()

  • 멀티 인덱스를 구성할 각 계층을 튜플로 부터 가져옴, name은 계층의 이름을 지정
index = pd.MultiIndex.from_tuples(
  [('서울', 2021), ('서울', 2022), ('부산', 2021), ('부산', 2022)],
  names = ['도시', '년도'])
df_multi_index2 = pd.DataFrame(
{'인구수' : [9700000, 9720000, 3400000, 3450000]}, index=index)
print(df_multi_index2)
             인구수
도시 년도           
서울 2021  9700000
   2022  9720000
부산 2021  3400000
   2022  3450000
  • 보다 상세한 데이터 조회가 가능(조건을 여러개 설정 가능)
df_multi_index.loc['서울', 2021]
# 
인구수    9700000
Name: (서울, 2021), dtype: int64
df_multi_index = df_multi_index.sort_index(ascending=True)
# 오류를 방지하기 위해 인덱스 정렬
print(df_multi_index.loc['부산':'부산'])
#
             인구수
도시 년도           
부산 2021  3400000
   2022  3450000
# 특정 레벨 또는 레벨을 넘어서 데이터 선택 / (선택 데이터, 레벨 = 제외)
print(df_multi_index.xs('서울', level = '도시'))
#
          인구수
년도           
2021  9700000
2022  9720000

Multi index 재구조화

stack - unstack

df_unstacked = df_multi_index.unstack(level = '년도')
# unstack() 인덱스를 열로 변환, stack 열을 인덱스로 변환
print(df_unstacked)
# 되돌리기 df_multi_index.stack()
#
        인구수         
년도     2021     2022
도시                  
부산  3400000  3450000
서울  9700000  9720000

그룹화

  • 선정한 인덱스를 기준으로 그룹화 진행
# 그룹화로 멀티인덱스 생성
data = {
    '도시': ['서울', '서울', '부산', '부산', '서울', '부산'],
    '년도': [2021, 2022, 2021, 2022, 2021, 2022],
    '인구수': [9700000, 9720000, 3400000, 3450000, 9800000, 3500000],
    '소득': [60000, 62000, 45000, 46000, 63000, 47000]
}
df = pd.DataFrame(data)
#
grouped_df = df.groupby(['도시', '년도']).mean()
print(grouped_df)
#
               인구수       소득
도시 년도                      
부산 2021  3400000.0  45000.0
   2022  3475000.0  46500.0
서울 2021  9750000.0  61500.0
   2022  9720000.0  62000.0

.pivot()

  • 데이터 프레임 재구조화
  • 서브 데이터프레임 생성시 자주 활용
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 = '온도')
# index 행, columns 열 values 값
# values 를 빼면 모든 데이터가 들어감
print(pivot_df)
#
도시          부산  서울
날짜                
2023-01-01   6   2
2023-01-02   7   3

데이터 구조 해체

  • 하나하나 해체하여 긴 데이터로 만들어줌

.melt()

melted_df = pd.melt(
	df, id_vars=['날짜', '도시'], 
	value_vars =['온도', '습도'], value_name = '값')
# pd.melt(
	가져올 데이터 프레임, id_vars = [식별자-그대로 남겨둘 부분], 
    value_vars = [값으로 녹여낼 부분])
# 식별자는 데이터를 구분하는데 용이하도록 구성
print(melted_df)
#
           날짜  도시 variable   
0  2023-01-01  서울       온도   2
1  2023-01-02  서울       온도   3
2  2023-01-01  부산       온도   6
3  2023-01-02  부산       온도   7
4  2023-01-01  서울       습도  55
5  2023-01-02  서울       습도  60
6  2023-01-01  부산       습도  80
7  2023-01-02  부산       습도  85

연습코드

데이터 구조화 - 해체 - 재구조화 - 변경

  • 데이터 프레임 생성
concert_data = {
  '콘서트' : ['dlwlrma', 'Love,Poem', 'dlwlrma', 'Love,Poem', 'dlwlrma', 'Love,Poem'],
  '도시' : ['서울', '서울', '부산', '부산', '광주', '광주'],
  '관객수' : [23154, 28574, 6091, 6756, 6541, 112926]
}
con_df = pd.DataFrame(concert_data)
print(con_df)
# 단순 나열 
         콘서트  도시     관객수
0    dlwlrma  서울   23154
1  Love,Poem  서울   28574
2    dlwlrma  부산    6091
3  Love,Poem  부산    6756
4    dlwlrma  광주    6541
5  Love,Poem  광주  112926
  • .pivot() 이용해 구조화
pivot_con = con_df.pivot(
index = '콘서트', columns = '도시', values = '관객수')
print(pivot_con)
#
도시             광주    부산     서울
콘서트                           
Love,Poem  112926  6756  28574
dlwlrma      6541  6091  23154
  • .melt()로 해체
melted_con_df = pd.melt(
con_df, id_vars = ['콘서트', '도시'], value_vars = ['관객수'])
print(melted_con_df)
#
         콘서트  도시 variable   value
0    dlwlrma  서울      관객수   23154
1  Love,Poem  서울      관객수   28574
2    dlwlrma  부산      관객수    6091
3  Love,Poem  부산      관객수    6756
4    dlwlrma  광주      관객수    6541
5  Love,Poem  광주      관객수  112926
  • stack - unstack
열 데이터였던 도시명들이 도시의 항위 레벨로 이동됨
.unstack() 으로 복귀
중복된 결과가 생길 수 있다면 상호 실행이 불가능 할 수 있기에 주의
stacked_df = pivot_con.stack()
stacked_df
#
콘서트        도시
Love,Poem  광주    112926
           부산      6756
           서울     28574
dlwlrma    광주      6541
           부산      6091
           서울     23154
dtype: int64
  • 데이터 추가
con_df['공연장'] = ['KSPO Dome', 'KSPO Dome',
	'사직 실내 체육관', '사직 실내 체육관', 
	'광주여대 유니버사이드 체육관', '광주여대 유니버사이드 체육관']
print(con_df)
#
         콘서트  도시     관객수              공연장
0    dlwlrma  서울   23154        KSPO Dome
1  Love,Poem  서울   28574        KSPO Dome
2    dlwlrma  부산    6091        사직 실내 체육관
3  Love,Poem  부산    6756        사직 실내 체육관
4    dlwlrma  광주    6541  광주여대 유니버사이드 체육관
5  Love,Poem  광주  112926  광주여대 유니버사이드 체육관
  • 데이터 삭제(행 과 열)
#열 삭제
df_drop = con_df.drop(columns = '관객수')
print(df_drop)
#
         콘서트  도시              공연장
0    dlwlrma  서울        KSPO Dome
1  Love,Poem  서울        KSPO Dome
2    dlwlrma  부산        사직 실내 체육관
3  Love,Poem  부산        사직 실내 체육관
4    dlwlrma  광주  광주여대 유니버사이드 체육관
5  Love,Poem  광주  광주여대 유니버사이드 체육관

# 행 삭제
drop_df =con_df.drop(index = 0)
print(drop_df)
#
         콘서트  도시     관객수              공연장
1  Love,Poem  서울   28574        KSPO Dome
2    dlwlrma  부산    6091        사직 실내 체육관
3  Love,Poem  부산    6756        사직 실내 체육관
4    dlwlrma  광주    6541  광주여대 유니버사이드 체육관
5  Love,Poem  광주  112926  광주여대 유니버사이드 체육관