expr1과 expr2가 값이 같으면, null을 반환하고 그렇지 않으면 expr1을 반환한다.
expr1과 expr2는 같은 상위 데이터 타입에 속해야하며, 비교 가능해야 한다.
IFNULL(expr1, expr2)
expr1이 null이면 expr2를 반환한다. 그렇지 않으면 expr1을 반환한다.
expr1과 expr2에는 모든 데이터 타입이 입력될 수 있다.
COALESCE(expr1,expr2)와 같은 표현이다.
2. 예시
예시 데이터셋은 아래와 같다.
-- 예시 데이터 셋 제작 코드 WITHex_tableAS(SELECT30AScol1,37AScol2,55AScol3UNIONALLSELECTnullAScol1,17AScol2,1AScol3UNIONALLSELECTnullAScol1,nullAScol2,1AScol3UNIONALLSELECT3AScol1,3AScol2,nullAScol3)SELECT*FROMex_table;
위 예시 데이터에 null과 관련된 조건식( coalesce,nullif,ifnull)을 넣고 결과를 비교해보자 출력 결과는 테이블 맨 우측에 위치한 result 칼럼에서 확인할 수 있다.
/*
nullif 예시
*/WITHex_tableAS(SELECT30AScol1,37AScol2,55AScol3UNIONALLSELECTnullAScol1,17AScol2,1AScol3UNIONALLSELECTnullAScol1,nullAScol2,1AScol3UNIONALLSELECT3AScol1,2AScol2,nullAScol3)SELECTcol1,col2,nullif(col1,col2)asresult_nullif-- nullif는 expr 총 2개만 비교 가능FROMex_table
sheet_name : 엑셀 파일에서 불러올 시트명 지정 ( 디폴트 값은 0이며, 별도로 지정하지 않으면 첫번째 시트가 설정된다.)
header : 열 이름으로 사용할 행을 지정 ( 디폴트 값은 0이며, 별도로 지정하지 않으면 첫 행을 열의 이름으로 자동 지정된다.)
names : 열의 이름을 리스트 형태로 지정한다. ( 디폴트 값은 None이다.)
index_col : 인덱스로 사용할 열의 이름 또는 열의 번호를 지정한다. (생략하면 원본 데이터에 없는 0 부터 시작하는 행 번호가 첫번째 열에 추가된다.)
usecols : 파일에서 읽어올 데이터의 열을 선택 ( 디폴트 값은 None이며, 별도로 지정하지 않으면 전체 열이 선택된다. 데이터로 가져올 열을 지정하는 방법은 콤마 또는 콜론으로 지정할 수 있다.
nrows : 불러올 row 수
# 이름이 저장된 리스트 만들기 ( 인덱스 만들기 )
staff=np.unique(sheet_1["이름"].values).tolist()# 사원명 리스트 출력
이름이 저장된 리스트를 별도로 만들어 이름 칼럼을 기준으로 for문을 돌릴 것이다. 그러면 각각의 이름별로 파일이 분할된다.
파일을 분할하기 위해서 다음 코드를 응용할 것이다.
forsinstaff:#1 파일명 생성
file_name='.\_{}.xlsx'.format(s)# 파일이름 설정 (경로 포함)
#2 저장할 데이터프레임 생성
staff_save_df=df.loc[['staff_col']==s]#3 스태프 데이터프레임 저장되어있는
staff_save_df.to_excel(file_name)
한 시트만 저장한다면 위 코드로 충분하지만 한 파일에 여러 시트를 저장하려면 판다스의 ExcelWriter 구문을 활용해야한다.
# 파일명 생성
# 칼럼명 선택
forsinstaff_name:file_name=".\파일이름_{}.xlsx".format(s)# 파일 이름(경로 포함) 설정
writer=pd.ExcelWriter(file_name,engine="xlsxwriter")# 시트 합치기 위해, xlsxwriter 사용
# 시트별로 데이터 프레임 만들기
staff_save_df_1=sheet_1.loc[sheet_1["칼럼명"]=="조건"]staff_save_df_2=sheet_2[sheet_2["칼럼명"]=="조건"]staff_save_df_3=sheet_2.loc[sheet_2["칼럼명"]=="조건"]# 엑셀 파일로 변환
staff_save_df_1.to_excel(writer,sheet_name="설정하고자 하는 시트이름")# staff_save_df_1 : 분할 파일 1번 시트에 들어감
staff_save_df_2.to_excel(writer,sheet_name="설정하고자 하는 시트이름")# staff_save_df_2 : 분할 파일 2번 시트에 들어감
staff_save_df_3.to_excel(writer,sheet_name="설정하고자 하는 시트이름")# staff_save_df_3 : 분할 파일 3번 시트에 들어감
writer.save()
이렇게 하면 엑셀파일을 이름 기준으로 각각의 파일로 분할할 수 있다.
처음 소개한 예시상황에 대입하면 코드는 다음과 같다.
importpandasaspdfrompandasimportExcelWriterimportnumpyasnpsheet_1=pd.read_excel("./excel_split/2021년 12월 실적현황.xlsx",header=0,sheet_name="MAIN")sheet_2=pd.read_excel("./excel_split/2021년 12월 실적현황.xlsx",header=0,sheet_name="RAW")staff=np.unique(sheet_1["이름"].values).tolist()forsinstaff:file_name="./excel_split/2021년 12월 실적현황_{}.xlsx".format(s)# 파일 이름(경로 포함) 설정
writer=pd.ExcelWriter(file_name,engine="xlsxwriter")# 시트 합치기 위해, xlsxwriter 사용
# 시트별로 데이터 프레임 만들기
staff_save_df_1=sheet_1.loc[sheet_1["이름"]==s]staff_save_df_2=sheet_2[sheet_2["이름"]=="s"]# 시트 2도 이름별로 분할
staff_save_df_2=staff_save_df_2[staff_save_df_2["인센티브"]=="대상"]]# 추가 조건있다면 설정
# 엑셀 파일로 변환
staff_save_df_1.to_excel(writer,sheet_name="MAIN")# staff_save_df_1 : 분할 파일 1번 시트에 들어감
staff_save_df_2.to_excel(writer,sheet_name="MAIN_INCEN")# staff_save_df_2 : 분할 파일 2번 시트에 들어감
writer.save()