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

한빛출판네트워크

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

IT/모바일

파이썬 데이터 분석 입문 05, 특정 행을 필터링하기

한빛미디어

|

2017-11-30

|

by 클린턴 브라운리

73,225

분석해야 하는 파일에 필요한 것보다 많은 행이 포함되어 있는 경우가 종종 있다. 예를 들어 특정 단어나 숫자가 포함되어 있는 행만 필요하거나 특정 날짜와 연관된 행만 필요할 수 있다. 이러한 경우 파이썬을 사용하면 원하는 특정 행을 필터링할 수 있다.

 

엑셀에서 수동으로 행을 필터링하는 방법에 익숙한 독자가 있을지도 모르겠다. 여기에서는 이를 확장해 엑셀에서는 열기조차 어려운 대용량의 CSV 파일을 처리하는 방법과 수동으로 작업하려면 많은 시간이 소요되는 여러 CSV 파일을 처리하는 방법에 초점을 맞춘다.

 

이어지는 세 개 절에서는 입력 파일에서 특정 행을 필터링하는 세 가지 방법을 소개한다.

  • 특정 조건을 충족하는 행을 필터링하기
  • 특정 집합의 값을 포함하는 행을 필터링하기
  • 정규 표현식을 활용해 필터링하기

 

이하 소개하는 코드는 모두 일관된 구조나 형식을 가지고 있다. 이러한 공통된 구조를 살펴봄으로써 원하는 필터링을 위해 스크립트에서 수정할 부분을 쉽게 찾을 수 있을 것이다. 입력 파일에서 특정 행을 필터링하는 방법을 이해하려면 아래의 코드 구조에 집중해야 한다.

 

for row in filereader:

  ***if 행에 있는 값이 특정한 규칙(들)을 충족한다면***

    이러이러한 일을 한다.

  else:

    아니면 뭔가 다른 일을 한다.

 

위 의사 코드는 입력 파일에서 특정 행을 필터링하는 데 사용되는 코드의 공통된 구조를 보여준다. 이하 절들에서 ***으로 둘러싸인 라인들을 수정하여 특정 비즈니스 규칙을 적용하고 필요한 행을 추출하는 방법을 알아볼 것이다.

 

 

특정 조건을 충족하는 행의 필터링

 

기본 파이썬

특정한 조건을 충족하는 행을 필터링해야 하는 경우가 많이 있다. 예를 들어 비용이 특정 값을 초과하는 모든 행을 골라 데이터셋으로 만들고 싶을 수 있다. 또는 구매 일자가 특정 날짜 이전인 모든 행을 원할 수도 있다. 이런 경우 특정한 조건에 부합하는 행의 값을 판별하고, 그 조건에 충족하는 행을 필터링할 수 있다.

 

다음 예제는 두 가지 조건에 부합하는 행의 값을 판별하고, 그 조건을 충족하는 행으로 구성된 하위 데이터셋을 출력 파일로 작성하는 방법을 보여준다. Supplier Name이 Supplier Z이거나 또는 Cost가 $600.00 이상인 행만 필터링하고 그 결과를 출력 파일에 기록할 것이다. 이러한 조건을 충족하는 행의 하위 데이터셋을 필터링해보겠다. 텍스트 편집기에 다음 코드를 입력하고 파일명을 3csv_reader_value_meets_condition.py로 저장한다.

 

#!/usr/bin/env python3

import csv

import sys

 

input_file = sys.argv[1]

output_file = sys.argv[2]

 

with open(input_file, 'r', newline='') as csv_in_file:

  with open(output_file, 'w', newline=' ') as csv_out_file:

    filereader = csv.reader(csv_in_file)

    filewriter = csv.writer(csv_out_file)

    header = next(filereader)

    filewriter.writerow(header)

    for row_list in filereader:

      supplier = str(row_list[0]).strip()

      cost = str(row_list[3]).strip('$').replace(',', '')

      if supplier == 'Supplier Z' or float(cost) > 600.0:

        filewriter.writerow(row_list)

 

12행은 csv 모듈의 next() 함수를 사용하여 입력 파일의 첫 번째 행(헤더 행)을 header라는 리스트 변수로 할당한다. 13행은 그 헤더 행을 출력 파일에 쓴다.

 

15행은 각 행의 Supplier Name 열에 해당하는 값을 가져와서 supplier라는 변수에 할당한다. 리스트 인덱싱(row_list[0])을 사용하여 각 행의 첫 번째 열(Supplier Name)의 값을 가져온 다음 str() 함수를 사용하여 값을 문자열로 변환한다. 그다음 strip() 함수를 사용하여 문자열의 양끝에서 공백, 탭, 개행문자 등을 제거한다. 끝으로 이 문자열을 변수 supplier에 할당한다.

 

16행은 각 행의 Cost 열에 해당하는 값을 가져와서 cost라는 변수에 할당한다. 이를 위해 리스트 인덱싱(row_list[3])을 통해 각 행의 네 번째 열(Cost 열 )의 값을 가져온 다음 str()함수를 사용하여 값을 문자열로 변환한다. 그다음 strip() 함수를 사용하여 문자열에서 달러('$' ) 기호를 제거한 뒤, replace() 함수를 사용하여 쉼표(',' )도 제거한다. 마지막으로 이 문자열을 변수 cost에 할당한다.

 

17행은 각 행의 값들이 두 가지 조건에 부합하는지 판별하기 위해 if 문을 썼다. 즉 SupplierName이 Supplier Z이거나 Cost가 $600.00 이상인 행을 필터링한다. 첫 번째 조건은 if와 or 사이에 있고 supplier라는 변수의 값이 Supplier Z와 일치하는지를 판별한다. 두 번째 조건은 or와 : 사이에 있으며 부동소수점 숫자로 변환된 cost 변수의 값이 600.0보다 큰가를 판별한다.

 

18행에서는 filewriter의 writerow() 함수를 사용하여 조건을 만족하는 행을 출력 파일에 작성한다.

 

스크립트를 실행하려면 명령 줄에 다음을 입력하고 엔터 키를 누른다.

 

python 3csv_reader_value_meets_condition.py supplier_data.csv 3output.csv

 

명령 줄에 출력된 결과는 나오지 않지만 출력 파일인 3output.csv를 열어보면 결과를 확인할 수 있다. 원하는 결과를 얻었다면, 코드를 수정하여 Supplier Name 또는 Cost의 값을 다르게 설정하여 다른 데이터를 선택할 수 있다.

 

팬더스

팬더스는 특정 행과 열을 동시에 선택할 수 있는 loc() 함수를 제공한다. 쉼표를 기준으로 앞에는 행을 필터링하는 조건을 지정하고, 뒤에는 열을 필터링하는 조건을 지정하면 된다. 아래 스크립트는 loc() 함수를 이용해 Supplier Name 열의 값에 Z가 포함되거나 Cost 열의 값이 600.0보다 큰 모든 행을 필터링 조건으로 지정한다. 텍스트 편집기에 다음 코드를 입력하고 파일명을 pandas_value_meets_condition.py로 저장한다. 이 스크립트는 팬더스를 사용하여 CSV 파일을 파싱하고, 조건을 충족하는 행을 필터링하여 출력 파일에 작성한다.

 

#!/usr/bin/env python3

import pandas as pd

import sys

 

input_file = sys.argv[1]

output_file = sys.argv[2]

 

data_frame = pd.read_csv(input_file)

 

data_frame['Cost'] = data_frame['Cost'].str.strip('$').astype(float)

data_frame_value_meets_condition = data_frame.loc[(data_frame['Supplier Name']

  .str.contains('Z')) | (data_frame['Cost'] > 600.0), :]

data_frame_value_meets_condition.to_csv(output_file, index=False)

 

밑에서 둘째 줄을 보면 코드가 너무 길어서 역슬래시(\)를 기준으로 텍스트를 두 줄로 나누었다. 1장에서 보았듯이 파이썬 코드에서 두 줄을 한 줄로 해석하기 위해서는 역슬래시가 필요하다. 이후 예제 코드에서도 이를 자주 사용할 것이다. 스크립트 작성 시 역슬래시를 지우고 한 줄로 붙여도 상관없다.

 

명령 줄에서 스크립트를 실행하면, 데이터가 입력되고 출력 파일이 생성된다.

 

python pandas_value_meets_condition.py supplier_data.csv pandas_output.csv

 

명령 줄에는 결과가 출력되지 않지만 출력 파일인 pandas_output.csv를 열어 결과를 확인할 수 있다. loc() 함수의 인수를 사용하면 데이터에서 다양한 선택이 가능하다.

댓글 입력
자료실

최근 본 상품0