기본 파이썬을 사용하여 여러 개의 입력 파일에서 열의 합계와 평균을 계산해보겠다. 텍스트 편집기에 다음 코드를 입력하고 파일명을 10csv _reader _sum _average _from _multiple _files.py로 저장한다.(역주_ 이 파일을 비롯해 원서 깃허브 저장소에는 import string이 포함된 파일들이 있지만, 이는 필요 없는 명령이므로 책에서는 모두 삭제했다.)
#!/usr/bin/env python3
import csv
import glob
import os
import sys
input_path = sys.argv[1]
output_file = sys.argv[2]
output_header_list = ['file_name', 'total_sales', 'average_sales']
csv_out_file = open(output_file, 'a', newline='')
filewriter = csv.writer(csv_out_file)
filewriter.writerow(output_header_list)
for input_file in glob.glob(os.path.join(input_path,'sales_*')):
with open(input_file, 'r', newline='') as csv_in_file:
filereader = csv.reader(csv_in_file)
output_list = [ ]
output_list.append(os.path.basename(input_file))
header = next(filereader)
total_sales = 0.0
number_of_sales = 0.0
for row in filereader:
sale_amount = row[3]
total_sales += float(str(sale_amount).strip('$').replace(',',''))
number_of_sales += 1.0
average_sales = '{0:.2f}'.format(total_sales / number_of_sales)
output_list.append(total_sales)
output_list.append(average_sales)
filewriter.writerow(output_list)
csv_out_file.close()
11행에서 출력 파일의 열 헤더가 포함된 리스트를 만든다. 14행에서는 filewriter 객체를 만들고 15행에서 출력 파일에 헤더 행을 쓴다.
20행에서 결괏값을 저장할 비어 있는 리스트를 만든다. 각 입력 파일에 대한 합계와 평균을 계산해야 하므로 16행에서 입력 파일의 이름을 output_list에 추가한다.
22행에서 next() 함수를 사용하여 각 입력 파일에서 헤더 행을 제거한다. 23행에서 total_sales라는 변수를 만들고 그 값을 0으로 설정한다. 마찬가지로, 24행에서 number_of_sales라는 변수를 만들고 그 값을 0으로 설정한다. 25행은 각 입력 파일의 데이터 행을 반복하는 for문이다.
26행에서 리스트의 인덱스를 사용하여 Sale Amount 열의 데이터 값을 추출하고 이를 sales_amount 변수에 할당한다. 27행에서는 str() 함수를 사용하여 sales_amount의 값이 문자열인지 확인한 다음 strip() 및 replace() 함수를 사용하여 데이터 값에서 달러 기호와 쉼표를 제거한다. 그다음 float() 함수를 사용하여 값을 부동소수점 숫자로 변환한 뒤, 이 값을 total_sales의 값에 더한다. 28행은 number_of_sales의 값을 1씩 증가한다.
29행에서 total_sales의 값을 number_of_sales의 값으로 나누어 입력 파일의 평균 매출을 계산하고, 이 값을 소수점 이하 두 자리로 형식화하여 문자열로 변환한 뒤 average_sales 변수에 할당한다.
30행은 total_sales를 output_list의 두 번째 값으로 추가한다. 리스트의 첫 번째 값은 입력파일의 이름으로서, 앞서 21행에서 리스트에 추가했다. 31행에서 average_sales를 output_list의 세 번째 값으로 추가한다. 32행은 output_list의 값을 출력 파일에 쓴다.
스크립트는 각 입력 파일에 대해 이 코드를 실행하고 출력 파일에는 입력 파일명(file_name)열, 총 매출(total_sales) 열, 평균 매출(average_sales) 열이 포함된다.
스크립트를 실행하려면 명령 줄에 다음을 입력하고 엔터 키를 누른다.
python 10csv_reader_sum_average_from_multiple_files.py "C:\Users\Clinton\Desktop"
10output.csv
그다음 출력 파일인 10output.csv를 열어 결과를 확인할 수 있다.
팬더스
팬더스는 행 및 열의 통계 수치를 계산하는 데 사용할 수 있는 sum 및 mean 같은 요약통계 함수를 제공한다. 다음 코드는 여러 입력 파일에서 특정 열에 대한 두 가지 통계(합계 및 평균)를 계산하고 각 입력 파일의 결과를 출력 파일에 쓰는 방법을 보여준다.
팬더스로 열의 통계를 계산해보자.
텍스트 편집기에 다음 코드를 입력하고 파일명을 pandas_sum_average_from_multiple_files.py로 저장한다.
#!/usr/bin/env python3
import pandas as pd
import glob
import os
import sys
input_path = sys.argv[1]
output_file = sys.argv[2]
all_files = glob.glob(os.path.join(input_path,'sales_*'))
all_data_frames = []
for input_file in all_files:
data_frame = pd.read_csv(input_file, index_col=None)
total_sales = pd.DataFrame([float(str(value).strip('$').replace(',','')) \
for value in data_frame.loc[:, 'Sale Amount']]).sum()
average_sales = pd.DataFrame([float(str(value).strip('$').replace(',','')) \
for value in data_frame.loc[:, 'Sale Amount']]).mean()
data = {'file_name': os.path.basename(input_file),
'total_sales': total_sales,
'average_sales': average_sales}
all_data_frames.append(pd.DataFrame(data, \
columns=['file_name', 'total_sales', 'average_sales']))
data_frames_concat = pd.concat(all_data_frames, axis=0, ignore_index=True)
data_frames_concat.to_csv(output_file, index = False)
리스트 축약을 사용하여 Sale Amount 열의 문자열 값을 부동소수점 숫자로 바꾼 다음 DataFrame() 함수를 사용하여 개체를 데이터프레임으로 변환하여 sum()과 mean() 함수를 사용하여 합과 평균을 계산했다.
출력 파일의 각 행에는 입력 파일 이름, 합계, 평균이 포함되어 있어야 하므로 이 세 가지 값을 데이터프레임에 포함하고, concat() 함수를 사용하여 모든 데이터프레임을 하나로 합친 다음이 데이터프레임을 출력 파일에 쓴다.
스크립트를 실행하려면 명령 줄에 다음을 입력하고 엔터 키를 누른다.
python pandas_sum_average_from_multiple_files.py "C:\Users\Clinton\Desktop" pandas_output.csv
그다음 출력 파일인 pandas_output.csv를 열어 결과를 확인할 수 있다.
이 장에서 많은 것을 배웠다. CSV 파일을 읽고 파싱하고, CSV 파일에서 행과 열을 탐색하고, 여러 개의 CSV 파일을 처리하고, 여러 개의 CSV 파일에 대한 통계 수치를 계산하는 방법에 대해서 살펴보았다. 이 장의 예제를 제대로 따라 했다면 총 12개의 파이썬 스크립트를 작성했을 것이다.
이들 예제로 가장 강조하고 싶은 점은 이러한 작업들이 데이터를 포함하는 파일을 탐색하고 처리하기 위한 기본적인 구성 요소라는 점이다. 따라서 이 장의 예제들을 정확하게 익혔다면 다음 장의 주제인 엑셀 파일을 처리할 준비 또한 된 것이다.
최신 콘텐츠