여러 개의 파일을 처리해야 할 때는 하나하나 전처리를 진행하는 것은 비효율적일 수 있다. 이런 경우에는 반복문을 사용하여 자동화된 전처리 과정을 구현하는 것이 좋다.
예를 들어, 여러 개의 파일이 특정한 폴더에 있다면, 다음과 같은 과정을 통해 전처리를 자동화할 수 있다.
1) 해당 폴더에 있는 모든 파일의 리스트를 가져온다.
2) 각 파일에 대해 전처리 과정을 수행한다.
3) 전처리가 완료된 데이터를 새로운 파일이나 데이터프레임에 추가하거나 저장한다.
이렇게 하면 파일이 늘어날 때마다 전처리를 일일이 수행하지 않아도 되므로 작업을 효율적으로 처리할 수 있다.
절대 경로
는 파일의 전체 경로를 나타내며, 파일 시스템의 루트 디렉토리부터 파일까지의 경로를 포함한다.
반면에 상대 경로
는 현재 작업 중인 위치(디렉토리)를 기준으로 한 파일의 위치를 나타낸다. 상대 경로는 현재 작업 중인 위치부터 파일까지의 경로를 나타내며, 따라서 파일이 위치한 폴더의 상대적인 위치를 기반으로 한다.
os
모듈을 사용하여 파이썬에서 파일 시스템을 다룰 수 있다.
import os
os.getcwd() # 현재 작업 중인 디렉토리(폴터)의 경로 반환
os.listdir(path) # 지정된 경로에 있는 파일 및 디렉토리의 목록 반환
이때 path에는 아래와 같이 상대 경로나 절대 경로를 입력할 수 있다.
os.listdir('./123/456/789') # 상대 경로
os.listdir('Users/이름/Documnets/123/456/789') # 절대 경로
os.mkdir(path) # 지정된 경로에 새로운 디렉토리 생성
이를 통해 파이썬을 사용하여 폴더를 생성하거나 파일 시스템을 탐색할 수 있다.
# source
src = '/Users/이름/Downloads/Data'
# destination
dst = '/Users/이름/Downloads/Data_result'
file_ls = os.listdir('/Users/이름/Downloads/Data')
os.path.join(src, file_ls[0])
os.path.join 함수를 활용하여 전체 경로를 확인할 수 있다.
for f in file_ls:
print(f)
print(os.path.join(src, f))
print(os.path.join(dst, f))
# 결과값:
# 3_상품군별거래액.csv
/Users/이름/Downloads/Data/3_상품군별거래액.csv
/Users/이름/Downloads/Data_result/3_상품군별거래액.csv
os.path.join
을 이용해서 파일을 불러오고, 어디에 저장을 할 것인지 두 가지 경로를 만들 수 있다.
for f in file_ls:
print(f)
df = pd.read_csv(os.path.join(src, f), encoding='cp949')
print(df.columns[:3])
# print(os.path.join(src, f))
# print(os.path.join(dst, f))
# 결과값:
# 3_온라인쇼핑몰 판매매체별 상품군별거래액.csv
# Index(['상품군별(1)', '상품군별(2)', '판매매체별(1)'], dtype='object')
# 1_온라인쇼핑몰 운영형태별 상품군별거래액.csv
# Index(['상품군별(1)', '상품군별(2)', '운영형태별(1)'], dtype='object')
# 2_온라인쇼핑몰 취급상품범위별 상품군별거래액.csv
# Index(['상품군별(1)', '상품군별(2)', '범위별(1)'], dtype='object')
폴더 내에 있는 csv 파일들을 순차적으로 꺼내올 수 있다.
for f in file_ls:
print(f'{f}를 처리하고 있습니다.')
df = pd.read_csv(os.path.join(src, f), encoding='cp949')
result = df.melt(id_vars=df.columns[:3],
var_name='날짜',
value_name='거래액')
result["거래액"] = result["거래액"].apply(strtoint)
result = result[result[result.columns[0]] != "합계"]
result = result[result[result.columns[2]] != "계"]
result = result[result[result.columns[1]] == "소계"]
result.drop(result.columns[1], axis='columns', inplace=True)
result['날짜'] = result['날짜'].apply(lambda x : x.replace(" p)", ""))
result['날짜'] = result['날짜'].apply(lambda x : x.replace(".", "/"))
result.to_csv(os.path.join(dst, f), encoding='cp949', index=False)
print(f'{f} 완료')
다음과 같이 코드를 작성하면 3개의 csv 폴더를 동일하게 데이터 전처리가 가능하다.