한빛출판네트워크

IT/모바일

파이썬 데이터 분석 입문 06, 특정 집합의 값을 포함하는 행의 필터링

한빛미디어

|

2017-12-08

by 클린턴 브라운리

기본 파이썬

때로는 관심 대상인 집합을 포함하는 행을 필터링해야 하는 경우가 있다. 예를 들어 SupplierName 열에서 집합 {Supplier X, Supplier Y} 중 한 값을 포함하는 모든 행을 선택하고 싶을 수 있다.(4 편의상 중괄호로 집합을 표시했다. 파이썬의 딕셔너리 자료형을 나타내는 게 아니다.) 혹은 Purchase Date 열에서 구매 일자가 집합 {'1/20/14', '1/30/14'} 중 한 값을 포함하는 모든 행을 필터링할 경우 등이 있다. 이런 경우에는 행의 데이터 값이 관심 집합의 원소로 포함되는지 먼저 판별하고 필터링해야 한다.

 

다음 예제는 행의 데이터 값이 어떤 집합의 원소로 포함되는지를 판별하고, 전체 행 중에서 그 값이 관심 집합의 값을 포함하는 부분집합을 찾아내 출력 파일에 쓰는 방법을 보여준다. 이 예제에서는 Purchase Date열의 구매 일자가 집합 {'1/20/14', '1/30/14'}를 포함하는 경우, 해당 행을 찾아서 출력 파일에 쓴다. 특정 집합의 값을 포함하는 행을 필터링하는 코드를 살펴보자. 텍스트 편집기에 다음 코드를 입력하고 파일명을 4csv _reader _value _in _set.py로 저장한다.

 

#!/usr/bin/env python3

import csv

import sys

 

input_file = sys.argv[1]

output_file = sys.argv[2]

 

important_dates = ['1/20/14', '1/30/14']

 

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:

      a_date = row_list[4]

        if a_date in important_dates:

          filewriter.writerow(row_list)

 

 

8행에서 관심 값에 해당하는 두 날짜가 포함된 important_dates라는 리스트 변수를 만들었다. 이 변수가 바로 관심 집합에 해당한다. 관심 값을 포함하는 변수를 만들고 코드에서 그 변수를 참조하도록 하는 것이 좋다. 이렇게 하면 관심 값이 달라지더라도 변수를 정의하는 위치에서 한 번만 수정하면 변경된 사항이 코드 전체에 적용되기 때문이다. 

 

17행에서는 각 행에서 Purchase Date열을 가져와서 그 값을 a_date라는 변수에 할당한다. 리스트 인덱싱 row_list[4]를 통해서 Purchase Date가 다섯 번째 열이란 것을 알 수 있다. 18번과 19행에서 if 문을 사용하여 a_date 변수에 들어 있는 Purchase Date열의 데이터 값이 important_dates에서 정의된 관심 집합에 포함되는지 여부를 판별한 뒤, 관심 집합에 포함된 값이라면 그 행을 출력 파일에 기록한다.

 

다음과 같이 명령 줄에서 이 스크립트를 실행한다. 그다음 출력 파일인 4output.csv를 열어 결과를 확인할 수 있다.

 

python 4csv_reader_value_in_set.py supplier_data.csv 4output.csv

 

 

팬더스

팬더스를 이용하여 관심 집합에 값이 포함되어 있는 행을 필터링해보겠다. 텍스트 편집기에 다음 코드를 입력하고 파일명을 pandas_value_in_set.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)

 

important_dates = ['1/20/14', '1/30/14']

data_frame_value_in_set = data_frame.loc[data_frame['Purchase Date']\

.isin(important_dates), :]

 

data_frame_value_in_set.to_csv(output_file, index=False)

 

새로운 명령어인 isin()을 볼 수 있다.(역주_ 포함되어 있는가(is in)라는 뜻이다.)

마찬가지로 명령 줄에서 입력 및 출력 파일 이름 인수를 입력하고 스크립트를 실행한다.

 

python pandas_value_in_set.py supplier_data.csv pandas_output.csv

 

그다음 출력 파일인 pandas_output.csv를 열어 결과를 확인할 수 있다.

댓글 입력