자신에게 친절할 것 :)

Data Science/Pandas

[데이터 전처리] 데이터 합치기) 같은 형식 concat() / 칼럼 기준 merge() / 인덱스 기준 join()

Tashapark 2024. 6. 25. 17:29
728x90

# 코드잇 데이터 사이언티스트 강의 듣는 중

 


<같은 형식의 데이터 합치기>

- pd.concat()

 

- 같은 변수를 합칠 때 

import pandas as pd

english_df1 = pd.DataFrame({
    'name': ['dongwook', 'taeho', 'jimin'],
    'english_score': [50, 89, 68]
})

english_df2 = pd.DataFrame({
    'name': ['yoonseo', 'sowon', 'haeun'],
    'english_score': [88, 91, 72]
})

 

--> english_df1

 

 

 

 

--> english_df2

 

--> 2개의 형식이 같기에 그냥 합치는 게 나음

 

pd.concat([english_df1, english_df2])

 

--> 디폴트가 행으로 그냥 추가되어서(위아래), 파라미터를 추가해야 함. 

 

 

 

 

 

 

english_df = pd.concat([english_df1, english_df2], ignore_index= True)

 

--> ignore_index = True로  인덱스 번호를 다시 부여하게 함. 

 

 

 

 

 

 

 

- 다른 변수를 합칠 때 

math_df = pd.DataFrame({
    'name': ['dongwook', 'taeho', 'jimin', 'yoonsoo', 'sowon', 'haeun'],
    'math_score': [86, 31, 91, 75, 68, 80]
})

math_df

 

--> 명단이 위 데이터와 같음

 

 

 

 

 

 

pd.concat([english_df, math_df])

 

--> 디폴트가 행으로 그냥 추가되어서(위아래), 파라미터를 추가해야 함. 

 

--> 해당 값이 없으면 nan으로 나타남. 

 

 

 

 

 

 

 

 

 

 

 

 

pd.concat([english_df, math_df], axis=1)

 

--> axis = 1을 추가해서 기준을 벡터로 바꿔주면, 위아래가 아니라, 옆에 더해짐. 

 

 

 

 

 


<조인 Join 연산>

 

- 공통으로 들어 있는 값(키, key)을 기준으로 데이터를 합치는 것.

- 4개의 종류

 - inner join(공통된 값만 합침), left outer join(왼쪽 데이터 기준으로 합침, 다른 쪽은 결측치),  right outer join(오른쪽 데이터 기준으로 합침, 다른 쪽은 결측치), full outer join(데이터 값 모두 합침, 정보가 없으면 결측치)

 

- 실무에서는 inner join과 left outerjoin을 많이 사용.

- merge()와 join()에서 사용함. 

 

+ 조인 종류 이전에 정리해 둠.

https://tashapark.tistory.com/entry/EDA-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%95%A9%EC%B9%98%EA%B8%B0-merge-inner-join-left-outer-join-right-outer-join-full-outer-join

 

[EDA] 데이터 합치기 .merge; inner join, left outer join, right outer join, full outer join

# 코드잇 데이터 사이언스 강의 듣는 중1. inner join2. left outer join3. right outer join4. full outer join     1. inner join  - 겹치는 부분만 합치겠다는 의미.- 아래 예시를 보면 겹치는 3 상품만 합쳐져서

tashapark.tistory.com

 


<칼럼 기준 데이터 합치기>

- pd.merge()

- 파라미터로 (왼쪽 값, 오른쪽 값, on='키 값', how='조인 방식')

 

- 데이터 간 공통된 변수명이 있을 때 

 

employee_df

 

--> 100명 

 

 

 

 

 

 

 

 

survey_df

 

--> 76명만 서베이에 대답했음. 

 

 

 

 

 

--> 두 데이터가 겹치는 값은 id와 department인데 소속은 개인당 겹칠 수 있기 때문에 고유값을 갖는 id를 키 값으로 사용함. 

pd.merge(employee_df, survey_df, on='id')

 

--> then, 76명임 

 

--> merge는 기본 값이 inner join 임.

그래서 모두 들어있는 설문조사 값만 나타남. 

--> 사실상 how='inner'

 

 

 

 

 

 

pd.merge(employee_df, survey_df, on='id', how='left')

 

--> 100명으로 왼쪽의 직원수를 기준으로 합쳐짐 

--> left outer join

--> how='left'

 

 

 

 

 

 

pd.merge(employee_df, survey_df, on='id', how='right')

 

--> 76명으로 오른쪽 서베이를 한 직원 수 기준으로 합쳐짐 

--> right outer join

--> how='right'

 

 

 

 

 

 

 

pd.merge(employee_df, survey_df, on='id', how='outer')

 

--> 총 인원이라 100명

--> full outer join

--> how='outer'

 

 

 

 

 

 

 

 

- 중복된 벡터 접미사 수정 suffixes=()

- department도 두 데이터의 공통된 값이었기 때문에 합쳐질 때, 중복되지 않게  각각 _x와 _y가 붙었음. 

pd.merge(employee_df, survey_df, on='id', how='outer', suffixes=('_left', '_right'))

 

--> suffixes=('_왼쪽 변경 접미사', '_오른쪽 변경 접미사')

 

 

 

 

 

- 그냥 접미사를 없앨 수도 있음

pd.merge(employee_df, survey_df, on='id', how='outer', suffixes=('', '_x'))

 

--> 비워두면 됨. 

--> 핵심은 2개가 같지만 않으면 됨.

 

 

 

 


- 공통된 변수명이 없을 때 

- 각각의 이름을 넣어주면 됨. 단, 값이 같아야 함. 

pd.merge(employee_df, survey_df, left_on='id', right_on='employee_id')

#새로운 데이터 프레임을 만들면 활용하기 편함
company_df = pd.merge(employee_df, survey_df, left_on='id', right_on='employee_id')

 

--> left_in='', right_on='' 위치에 맞게 넣어주면 됨. 

 

 

 

 

 

 

 

 

 

 


++ merge에서도 인덱스 기준으로 합칠 수 있음. 

import pandas as pd

employee_df = pd.read_csv('data/employee.csv', index_col='id')
survey_df = pd.read_csv('data/survey.csv', index_col='id')

#둘의 인덱스가 모두 id일 때 이것을 키값으로 사용함
pd.merge(employee_df, survey_df, left_index=True, right_index=True)

 

- 한 쪽 값만 키 값으로 사용가능함.

- 대신, True가 아닌 값은 특정 칼럼을 키 값으로 지정해야 함. 

#예시
pd.merge(employee_df, survey_df, left_index=True, right_on='role')

 


<인덱스 기준 데이터 합치기>

- .join()

- join은 기본적으로 인덱스를 키값으로 사용하기 때문에 .set_index()로 지정을 미리 해줘야 함.

#우선 변수 명 변경
survey_df = survey_df.rename(columns ={'id':'employee_id'})

# 인덱스 값을 키값으로 지정해줌 
employee_df = employee_df.set_index('id')
survey_df = survey_df.set_index('employee_id')

 

 

- 조인은 suffix를 merge랑 달리 자동으로 부여하지 않기 때문에 넣어줘야 함. 

- 왼쪽 df.join(오른쪽 df, lsuffix='', rsuffix='')

employee_df.join(survey_df, lsuffix='_x', rsuffix='_y')

 

 

--> 인덱스 값이 키 값이고 겹치는 department에 접미사가 부여됨

 

 

 

 

 

 

 

 

 

 

- 왼쪽의 접미사를 없애고 싶으면, 그냥 오른쪽만 넣어주면 됨. 

employee_df.join(survey_df, rsuffix='_x')

 

--> join은 본적으로 left outer join

 

--> 따라서 설문조사가 있는 경우만 보려면 inner join으로 바꿔야 함. 

 

--> merge랑 똑같이 how='' 파라미터 사용함. 

 

 

 

 

 

 

company_df = employee_df.join(survey_df, rsuffix='_x', how='inner')

 

 

--> 이렇게 해주면 설문조사에 참여한 경우만 나타남. 

 

 

 

 

 

 

 

 

 


++ join에서도 칼럼을 키값으로  합칠 수 있음. 

import pandas as pd

#사원 번호를 다시 컬럼으로 바꿔줌
employee_df = employee_df.reset_index()


#왼쪽 데이터만 인덱스나 컬럼(on) 자유롭게 선택 가능, 서픽스 잊으면 안돼
employee_df.join(survey_df, on='id', rsuffix='_x')

 

- 무조건 왼쪽 데이터만 인덱스나 칼럼(on='')을 선택해서 키값으로 지정이 가능함.

- 오른쪽 데이터는 인덱스만 키값으로 사용 가능 

에러 나지 않게 suffix는 꼭 설정해 줄 것. 


merge() join()
- pd.merge()
- inner join이 디폴트 
- 칼럼 기준 데이터 합치기 
- 공통된 변수명 확인 시 접미사가 자동적으로 추가 됨
- 다양한 옵션 사용가능
- 데이터프레임.join()
- left outer join이 디폴트 
- 인덱스 기준 데이터 합치기 
- 공통된 변수명 확인 시 접미사를 반드시 추가해야 함 (안하면 에러) 
- 인덱스가 키 값으로 설정 시 더 간결한 코드로 합칠 수 있음. 
- join 연산에서 사용 
- 사실 둘 다 인덱스나 칼럼의 키 값을 기준으로  연산이 가능하지만, 더 간결하게 쓸 수 있는 상황이 있음. 

 

728x90
반응형