pandas기초 _ 데이터 전처리(합치기(concat, merge), Groupby)
Python

pandas기초 _ 데이터 전처리(합치기(concat, merge), Groupby)

728x90

◎ pandas로 데이터 합치기

우리가 효과적인 데이터 분석을 하기 위해서는 여러개의 파일을 하나로 합치는 것이 필요하다.

  • pd.concat() -> concatenate
  • pd.merge -> Merge

▷ Concat(concatenate)

concat은 '더한다' 혹은 '붙인다'라는 의미로 생각하면 이해가 편하다.

예를 들어, 2개의 문자열을 + 연산자를 이용해 "붙일" 수 있다.

data.frame도 열이나 행을 기준으로 더할 수 있습니다. 간단한 예시를 보자.

 

  • 인덱스가 같은경우
    • 열방향의 병합이 default(행방향으로 하려면 axis=1 옵션추가
import pandas as pd

df1 = pd.DataFrame([['A', 'B'],
                    ['C', 'D'],columns=list('1','2'))
 
df2 = pd.DataFrame([['E', 'F'],
                     ['G', 'H'], columns=['1', '2',], index=[4, 5])

df1
    1   2
0  A0  A1
1  B0  B1


df2
    1   2   
4  A4  A5  
5  B4  B5

 

 

  • 인덱스가 다른경우

 

 

- With python

import pandas as pd

x = pd.DataFrame([['AX','AY'],['BX','BY']], index = ['A','B'], columns = ['X','Y'])
y = pd.DataFrame([['AX','AZ'],['CX','CZ']], index = ['A','C'], columns = ['X','Z'])

X 출력
Y 출력

pd.concat([x, y]) ## concate_by_row

pd.concat([x, y], axis = 1) ## concate_by_column

데이터프레임을 더할 때, 일반적으로는 더해지는 행, 열의 이름이나 인덱스 값이 일치해야 한다.

만약 그렇지 않은 경우, 비어있는 부분에 대해서는 (결측치를 의미하는) NaN 값으로 채워지게 된다.

 

▷ Merge

merge는 concat과 다르게 공통된 부분을 기반으로 합치기가 주요 용도이다.

 

- on 옵션을 통해 공통 칼럼 설정가능

- how를 통해 join형식 설정가능. Defualt는 inner join

- With python

import pandas as pd

left = pd.DataFrame({'key': ['K0', 'K4', 'K2', 'K3'],
                     'A': ['A0', 'A4', 'A2', 'A3'],
                     'B': ['B0', 'B4', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})

- Left

- Right

- key를 기준으로 inner join 실행

pd.merge(left, right, on='key', how='inner')

- Concat VS Merge

새롭게 만들려고 하는 과정을 자세히 보면, 종목(종목코드) 를 기준으로 합친다는 것을 알 수 있다.

df2 = pd.DataFrame(
    {'종목' : ['000080', '000890', '005300', '027740', '035810', '136480', '136490'],
     '종목명': ['하이트진로', '보해양조', '롯데칠성', '마니커', '이지홀딩스', '하림', '선진'], 
     '테마' : ['주류', '주류', '주류', '육계', '육계', '육계', '돼지고기']}
)
df2

pd.concat([df, df2], axis = 1)

종목이라는 column은 중복되어 처리가 되어 있으며, 데이터가 비어있는 부분 (선진)도 있다.

물론 잘라내고 붙이는 방법도 있겠지만 조금 더 간편한 방법인 Merge를 시도해 볼 수 있을 것이다.

 

# Merge 문법
df.merge("붙일 내용", how = "(방법)", on ="(기준 feature)")
df = df.merge(df2, how = 'inner', on = '종목')
df

inner조인을 사용해서 공통적인 부분을 매칭해서 데이터를 합쳤다.

 


◎ Groupby 

 

raw나 column을 같은 범주로 묶는 방법인데 raw별 column별 합계와 평균을 알고 싶을때 사용하는 함수이다.

일단 데이터 프레임을 불러와 보자

  • 데이터는 코랩 샘플 데이터를 불러와서 예제에 사용
df = pd.read_csv('/content/sample_data/california_housing_train.csv')
df

total_rooms으로 groupby실행 

  • 보통 groupby의 범주는 번주형데이터로 하지만 현재 데이터는 범주형데이터가 없어서 임의로 설정
groups = df.groupby('total_rooms')
groups.size()

total_rooms

2.0 1

8.0 1

11.0 1

12.0 1

15.0 2

..

30401.0 1

30405.0 1

32054.0 1

32627.0 1

37937.0 1

Length: 5533, dtype: int64

 

total_rooms으로 그룹별 계산(mean, std, max, min)

groups.mean()

groups.max()

groups.aggregate([min,max]) #min, max 함께 출력

groups.aggregate(['mean','std']) # 평균, 표준편차 함께 출력

이렇게 원하는 결과에 따라서 Groupby함수로 출력이 가능한데 내가 자유자재로 쓰려면 많은 연습을 해야할 것이다.


 

 

728x90