메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

파이썬 데이터 분석 입문 10, 여러 개의 CSV 파일에서 합계 및 평균 계산하기

한빛미디어

|

2017-12-20

|

by 클린턴 브라운리

37,286

기본 파이썬을 사용하여 여러 개의 입력 파일에서 열의 합계와 평균을 계산해보겠다. 텍스트 편집기에 다음 코드를 입력하고 파일명을 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_salesoutput_list의 두 번째 값으로 추가한다. 리스트의 첫 번째 값은 입력파일의 이름으로서, 앞서 21행에서 리스트에 추가했다. 31행에서 average_salesoutput_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개의 파이썬 스크립트를 작성했을 것이다.

 

이들 예제로 가장 강조하고 싶은 점은 이러한 작업들이 데이터를 포함하는 파일을 탐색하고 처리하기 위한 기본적인 구성 요소라는 점이다. 따라서 이 장의 예제들을 정확하게 익혔다면 다음 장의 주제인 엑셀 파일을 처리할 준비 또한 된 것이다.

댓글 입력
자료실

최근 본 상품0