해피 코딩!

python - pandas를 활용한 Excel 저장하기 본문

Python

python - pandas를 활용한 Excel 저장하기

지속가능한 성장을 2021. 2. 16. 09:34

참고 사이트

본 내용은 작성자가 python의 pandas 라이브러리를 활용하여, Excel 파일의 데이터를 저장한 내용을 정리하고자 다양한 블로그와 문서를 읽고 내용을 취합하였습니다.

대부분의 내용의 출처는 참고 사이트 를 통해 가져왔으며 자세한 내용은 위 링크를 통해 확인 부탁드립니다.

개인적인 추천으로 판다스의 사용이 익숙하지 않으신 분들은Jupyter Notebook 을 활용하여 따라해보시길 권장 합니다.

파일은 DjangoForm을 활용하여 업로드하는 형태로 구현했습니다.

목차 순서 - 클릭하면 이동합니다.

초기 세팅에 도움이 되는 설정

파일 열기

import pandas import numpy df = pandas.read_excel('file_name.xlsx')

header는 해당 열 위치를 조정하여 해당 행의 이름을 header의 데이터로 지정할 수 있는 파라미터 입니다.
header 위의 데이터들은 전부 제외되기 때문에 주의하기 바랍니다.

df = pandas.read_excel('file_name.xlsx', header=1)

keep_default_na

keep_default_na 는 엑셀 셀이 공백일 경우, 자동으로 NaN으로 지정할 것 인가 아닌가를 세팅할 수 있습니다. 기존 Default 값은 True 기 때문에
기존의 출력 값이 없을 경우에는 Nan으로 출력이 된다. 하지만 이런 NaN 을 원하지 않는 경우에는 False 값 지정을 사용하여 공백의 출력 값을 문자열 공백으로 출력할 수 있습니다.

df = pandas.read_excel('file_name.xlsx', header=1, keep_default_na=False)

Index_col

index_col은 행의 몇 번째 행을 데이터 프레임의 인덱스로 설정하여 수치로 활용할 수 있는지에 대한 파라미터이며, 따로 설정하지 않는다면 각 행의 번호 값이 인덱스로 설정이 됩니다.

df = pandas.read_excel('file_name.xlsx', header=1, index_col=1, keep_default_na=False)

sheet_name

엑셀 파일에 있는 각 시트별로 접근할 수 있는 파라미터 설정 입니다.

df = pandas.read_excel('file_name.xlsm', header=1, sheet_name='sheet1', index_col=1, keep_default_na=False)

usecols

usecols는 엑셀 파일의 특정 행들을 지정하여 꺼내올 수 있는 파라미터 입니다. 파이썬의 리스트 자료형의 슬라이싱과 비슷한 형태로도 사용할 수 있으며 특정 컬럼을 지정할 수 도 있습니다.

df = pandas.read_excel('1월 조립 계획서 Rev01_메크로.xlsm', header=1, sheet_name='BOM', index_col=0, keep_default_na=False, usecols='B:X' )[:303]

딕셔너리를 활용한 여러 시트를 넣는 방법

work_sheet = ['sheet1', 'sheet2', 'sheet3'] cols = ['B:Y', 'A, C:E', 'B:X'] headers = [1, 2, 3, 4] # 두 개인 경우에는 ZIP을 이용한다. lst = [ws, cols, headers] dic = {} reps = len(work_sheet) for index in range(reps): name = lst[0][index] sheet_name_var = lst[0][index] use_cols_var = lst[1][index] header_var = lst[2][index] dic[name] = pandas.read_excel('file_name.xlsm', header=header_var, sheet_name=sheet_name_var, keep_default_na=False, usecols=use_cols_var, )

각 값들에 대한 접근은 dic['sheet_name'] 또는 dic.get('sheet_name')을 활용하시면 됩니다.

dic.get('material_number') 와 같이 사용하면 됩니다.

데이터 디스플레이

display(df) # 또는 df 

데이터 입출력

행을 통한 필드 구분

print(list(df.columns))

열 방향의 인덱스 .columns

df.columns

특정 범위를 가져올 때 사용하는 리스트 슬라이싱

리스트의 슬라이싱을 이용하여 가져온다

df["제품번호"][:42]

라벨의 이름을 이용하여 선택하기 : .loc

라벨의 이름을 이용하여 선택할 수 있는 .loc 방법도 있습니다.
첫 번째 인덱스의 값에 해당하는 모든 칼럼의 값 가져오기,

df.loc[0]

특정 로우 값, 컬럼 값에 대하여 가져오기

컬럼 A와 컬럼 B에 대한 모든 값 가져오기

df.loc[5:10, ['col_1_field_name', 'col_4_field_name']]

컬럼 순서 변경하기

df = pandas.DataFrame(df, columns=['col_4_field_name', 'col_2_field_name', 'col_8_field_name'])

인덱스 순서 변경

df = df.reindex(index=[4, 0])

위치를 기준으로 데이터 선택하여 가져오기

loc에서 i를 합친 문법이며 큰 차이는 없다. 리스트에서 index 의 의미를 가진 i 값 이다.

df.iloc[3:5, 1:6] df.iloc[[1, 2, 4, 6], [3, 6]]

데이터 선택 (selection)

데이터 프레임 자체가 갖고 있는 [] 슬라이싱 기능을 이용하는 방법 입니다.
특정 컬럼 의 값들만 가지고 오고 싶다면 df['A']와 같은 형태로 입력하며 이는 df.A와 동일합니다. 리턴되는 Series의 자료구조를 가지고 있습니다.

# 각 행에 해당하는 데이터 꺼내오기 df["제품번호"]

Iterrows를 활용한 열들의 순회

python의 enumerate처럼 각 값들을 순회하면서 index 에 대한 값 까지 함께 알 수 있다.

이 때 index의 값을 index_col 을 통해 지정하였다면, 해당하는 값이 인덱스 값에 해당하며 그렇지 않다면 기본 행의 값으로 적용이 된다.

row의 값들은 각 행의 값을 통해 접근하면 특정 행과 열에 대한 엑셀 데이터를 꺼내올 수 있다.

for index, row in df.iterrows(): print(index) print(index) print(row['col1_name'], print(row['col2_name'], print(row['col3_name'], print(row['col4_name'], 

Pandas DataFrame으로 변경하기

df = pandas.DataFrame(df, columns=['BOMLevel', '자재명', '자재번호', '자재규격'])

추가 & 삭제

컬럼 추가

import numpy df['c'] = numpy.nan

컬럼 삭제

del을 이용한 삭제
del df['colB']

drop을 이용한 삭제
new_df = df.drop("colA", axis=1)

조건 활용하기

조건을 이용하여 가져오기

특정한 열의 값들을 기준으로 조건을 만들어 해당 조건에 만족하는 행들만 선택할 수 있는 방법이 있습니다.

df[df.총소요량 > 1]

각 값을 기준으로 테이블 전체에서 정할 수 있습니다.
다음은 양수 값이 다 보여지고 나머지 값들 (0 혹은 음수)가 보여지는 예제 입니다.

df[df.총소요량 >0] # 0보다 작은 값은 NaN으로 보여집니다.

필터링 - isin

isin() 메서드를 제공한다. 해당 메서드는 해당 열에 들어있는 값을 기준으로 필터링 한다.

df[df['재고자산분류'].isin(['제품'])]

함수를 사용하여 값 변환하기

def change_quantity_of_row(row): if row > 0.5: return 'up' else: return 'down' df['총소요량'] = df.총소요량.apply(change_quantity_of_row) df

조건문을 활용하여 컬럼이 있는지 확인하기

if not '품번1' in list(dic['BOM'].columns):
Comments