콘솔워크

[Python] 데이터 프레임 left outer join (특정키로 조인)하고 빈 컬럼 나머지 데이터프레임으로 채우기 merge 본문

프로그래밍/python

[Python] 데이터 프레임 left outer join (특정키로 조인)하고 빈 컬럼 나머지 데이터프레임으로 채우기 merge

콘솔워크 2022. 6. 21. 16:34
반응형

내가 원하는 내용이 다소 복잡하여 글로 정리한다.

 

dataframe 두개가 있다. 각각 df1 그리고 df2라고 지칭하겠다.

 

일단 먼저 특정 컬럼을 기준으로 LEFT JOIN 하는 코드는 다음과 같다.

 

KEY 컬럼 ('묶음번호', '주문번호', '구매자')

 

DATAFRAME LEFT OUTER JOIN 예시

KEYS = ['묶음번호', '주문번호', '구매자']
SUFFIX = '_DROP'
df1 = df1.fillna('')
df2 = df2.fillna('')

merge_df = pd.merge(df1, df2, how='left', on=KEYS,
                    suffixes=('', SUFFIX))

- SUFFIX의 값은 두번째 DF에 붙는 접미사이다.

 

 

특정 컬럼의 값이 빈값인 경우 뒤의 데이터컬럼의 값으로 채우기

import pandas as pd
import numpy as np

    
NUM_COL = '송장번호'
SUFFIX = '_DROP'
NEW_NUM_COL = NUM_COL + SUFFIX

merge_df[NUM_COL] = np.where(
    merge_df[NUM_COL] == '', merge_df[NEW_NUM_COL], merge_df[NUM_COL])

 

 

하나의 데이터프레임에 '송장번호'라는 컬럼과 '송장번호_DROP'이라는 컬럼이 있다고 치자.

'송장번호' 컬럼이 빈값일 때만 '송장번호_DROP'의 컬럼으로 채우고 싶을 때 쓰는 코드이다.

 

여기서 np.where에서의 의미는 '송장번호' 컬럼이 비어있으면 '송장번호_DROP'으로 채우고 비어있지 않으면 그대로 '송장번호' 컬럼으로 사용하라는 뜻이다.

 

최종코드

import pandas as pd
import numpy as np


def get_merge_df(df1, df2):

    KEYS = ['묶음번호', '주문번호', '구매자']
    NUM_COL = '송장번호'
    DELI_COL = '택배사'
    SUFFIX = '_DROP'
    NEW_NUM_COL = NUM_COL + SUFFIX
    NEW_DELI_COL = DELI_COL + SUFFIX

    df1 = df1.fillna('')
    df2 = df2.fillna('')

    merge_df = pd.merge(df1, df2, how='left', on=KEYS,
                        suffixes=('', SUFFIX))

    merge_df[NUM_COL] = np.where(
        merge_df[NUM_COL] == '', merge_df[NEW_NUM_COL], merge_df[NUM_COL])

    merge_df[DELI_COL] = np.where(
        merge_df[DELI_COL] == '', merge_df[NEW_DELI_COL], merge_df[DELI_COL])

    # drop col
    merge_df.drop(
        [col for col in merge_df.columns if SUFFIX in col], axis=1, inplace=True)
    return merge_df

 

결론

1. 두개의 데이터 프레임을 KEYS 컬럼을 기준으로 left join 한다. 두번째 데이터프레임의 SUFFIX에는 _DROP으로 컬럼을 맞춰준다.

 

2. 첫번째 데이터프레임의 송장번호가 비어있으면 두번째 데이터프레임의 송장번호로 채운다.

SUFFIX가 붙은 컬럼들은 모두 제거한다.

 

최종적으로 merge_df가 완성된다.

반응형