본문 바로가기
공부/데이터 분석

[파이썬 데이터 분석 입문] Chapter 2. CSV 파일

by sshnnne 2022. 9. 3.

- CSV (comma-separated values) 파일

: 쉼표로 값이 구분된 텍스트 파일 포맷.

숫자 or 문자열로 구성된 표 형태의 데이터가 일반 텍스트로 저장됨.

 

2.1 기본 파이썬 대 팬더스

 

2.2 CSV 파일 읽고 쓰기

 

2.4 CSV 파일 읽고 쓰기 (CSV 모듈 사용)

 

2.5 특정 행을 필터링하기

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

- 기본 파이썬

for row in filereader:
	***if 행에 있는 값이 특정한 규칙들을 충족한다면***
    이러이러한 일을 한다
    
    else:
    	아니면 무언가 다른 일을 한다.

 

p.117

if supplier == 'Supplier Z' or float(cost) > 600.0:
	filewriter.writerow(row_list)

주어진 CSV 파일에서 Supplier name이 Supplier Z이거나 Cost가 $600.0 이상인 행을 필터링 한다.

 

- 팬더스

특정 행과 열을 동시에 선택할 수 있는 loc() 함수를 제공함.

 

loc() : 인덱스 기준으로 행 데이터 읽기

iloc() : 행 번호를 기준으로 행 데이터 읽기

 

인덱스 vs 행 번호

: 인덱스는 사용자 설정하기 나름. 행 번호는 컴퓨터에서 자체적으로 부여된 번호

 

loc() 함수 기본형

: 데이터프레임명.loc[인덱스]

 

print(df.loc[:,['year', 'continent']])

: 모든 행(:)에 대해 'year'와 'continent' 열 데이터만 가져오라는 명령어

 

 

iloc() 함수 기본형

: 데이터프레임명.iloc[행번호]

print(df.iloc[:,:3])

: 모든 행에 대하여 3번열 데이터 전까지 출력하라는 스크립트

 

 

2.5.2 특정 집합의 값을 포함하는 행의 필터링

- 기본 파이썬

: 관심 집합에 대한 변수를 만든다.

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

...

if a_date in important_dates:
	filewriter.writerow(row_list)

 

- 팬더스

import pandas as pd

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() 함수

:DataFrame 객체의 각 요소가 values 값과 일치하는지 여부를 boolean 값으로 반환

 

df.isin(values)

values가

1) series일 경우 : index가 일치해야 함

2) DataFrame일 경우 : index와 열 레이블이 일치해야 함

3) Dict일 경우 : key는 열 레이블

 

 

2.5.3 패턴/정규 표현식을 활용한 필터링

- 기본 파이썬

 

re 모듈(정규 표현식 모듈)

- 정규 표현식 관련 참조 링크 : https://brownbears.tistory.com/62

 

정규 표현식

정규 표현식이란? 정규표현식의 사전적인 의미로는 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어입니다.  주로 Programming Language나 Text Editor 등 에서 문자열의 검색과 치

brownbears.tistory.com

 

1) match(패턴, 문자열, 플래그)

: 문자열의 처음부터 시작해서 작성한 패턴이 일치하는지 확인

 

2) search(패턴, 문자열, 플래그)

: 패턴이 문자열의 처음부터 일치하지 않아도 됨. match()와 유사

 

3) findall(패턴, 문자열, 플래그)

: 문자열 안에 패턴에 맞는 케이스를 전부 찾아 리스트로 반환

 

4) finditer(패턴, 문자열, 플래그)

:findall()과 유사. 그러나 패턴에 맞는 문자열의 리스트가 아닌 iterator 형식으로 반환

 

5) fullmatch(패턴, 문자열, 플래그)

: 문자열의 시작과 끝이 정확하게 패턴과 일치할 때 반환

 

6) split(패턴, 문자열, 최대 split 수, 플래그)

: 문자열에서 패턴이 맍으면 이를 기점으로 리스트로 쪼개는 함수

 

7) sub(패턴, 교체할 문자열, 문자열, 최대 교체 수, 플래그)

: 문자열에 맞는 패턴을 두 번째 인자로 교체. 최대 교체 수를 지정하면 그 수가 도달할 시 더이상 교체하지 않음

 

re 모듈 관련 함수 참조 문서 : https://brownbears.tistory.com/506

 

[Python] re 모듈 사용법

regex는 정규 표현식으로 흔히 알려져 있습니다. 파이썬에서 정규 표현식을 사용할 때, 내장 모듈인 re를 사용하고 있습니다. re 모듈에서 제공해주는 함수들을 보면 match(), fullmatch(), findall(), search(

brownbears.tistory.com

 

- 팬더스

p. 124

data_frame_value_matches_pattern = data_frame.ix[data_frame['Invoice Number'.str.startswith("001-"), :]

1) .ix 메서드

: 레이블과 위치 정수를 사용하여 행에 접근하는 메서드. 그러나 pandas 버전에서는 사용하지 말 것을 권고.

 

- Series에서의 사용

Series.ix[index]

- DataFrame에서의 사용

DataFrame.ix[index] //행의 선택
DataFrame.ix[index, column] //하나의 요소 선택

 

 

2.7 연속된 행 선택하기

p. 133

row_counter 변수가 특정 조건을 만족했을 때 행을 읽어들이는 것 말고 바로 3행부터 15행까지 읽어들일 수는 없을까?

 

- 팬더스

drop()

: DataFrame에서 열을 삭제하는 메서드. pop()과는 다르게 원본이 변경되지는 않음.

 

2.9 여러 개의 CSV 파일 읽기

2.9.1 전체 파일 개수 및 각 파일의 행 및 열 개수 계산

 

- glob 모듈

: 특정 패턴과 일치하는 모든 경로명을 찾는다. 파일들의 리스트를 뽑을 때 사용. 파일의 경로명을 이용해서 입맛대로 ~~.

인자로 받은 패턴과 이름이 일치하는 모든 파일과 디렉터리의 리스트를 반환.

패턴을 *로 주면 모든 파일과 디렉터리를 볼 수 있음.

 

 

2.10 여러 파일의 데이터 합치기

- 기본 파이썬

import csv
import glob
import os
import sys

input_path = sys.argv[1]
output_file = sys.argv[2]

first_file = True
for input_file in glob.glob(os.path.join(input_path, 'sales_*')):
	print(os.path.basename(input_file))
    
    with open(input_file, 'r', newline = '') as csv_in_file:
    	with open(output_file, 'a', newline = '') as csv_out_file:
        	filereader = csv.reader(csv_in_file)
            filewriter = csv.writer(csv_out_file)
            
            if first_file :
            	for row in filereader:
                	filewriter.writerow(row)
                first_file = False
                
            else :
            	header = next(filereader)
                for row in filereader :
                	filewriter.writerow(row)

- 팬더스

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 file in all_files :
	data_frame = pd.read_csv(files, index_col = None)
    all_data_frames.append(data_frame)
    
data_frame_concat = pd.concat(all_data_frames, axis=0, ignore_index = True)
data_frame_concat.to_csv(output_file, index = False)

DataFrame을 수직 방향으로 합치는 코드.

 

DataFrame 결합 함수

1) concat()

: pd.concat([데이터프레임, 데이터프레임])

axis = 0인 경우는 세로로, axis = 1인 경우는 가로로 결합된다.

 

2) merge()

: pd.merge(df_left, df_right, how = 'inner', on=None)

left = 왼쪽 데이터프레임

right = 오른쪽 데이터프레임

how = join 방식 ('left', 'right', 'inner', 'outer'). 기본값은 inner

ex) left join : 왼쪽 데이터프레임을 기준으로 조인. 오른쪽 데이터프레임에 없는 값은 NaN으로 표시됨

inner join : 교집합. 양쪽에 공통으로 있는 값만 나타난다.

outer join : 모든 값이 나타나도록 한다. 왼/오 데이터프레임에 없는 값들은 NaN으로 표시됨.

 

on = 기준열

 

 

Numpy 데이터 병합 함수

1) np.concatenate([array1, array2], axis = 0)

2) np.vstack((array1, array2))

3) np.r_[array1, array2]

 

 

2.11 파일에서 데이터 값의 합계 및 평균 계산하기

- 기본 파이썬

 

glob.glob()

: 파라미터에 명시된 저장 경로와 패턴에 해당하는 파일명을 리스트 형식으로 반환.

os.path.join()

: 파이썬 경로를 다룰 때 유용한 함수. 파라미터에 생성하고 싶은 경로의 문자열을 입력해주면 된다.

iter(호출 가능한 객체, 반복을 끝낼 값)

: 특정 값이 나올 때 반복을 끝낸다.

import random

for i in iter(lambda : random.randint(0,5), 2):
	print(i, end = '')
import random

while True:
	i = random.randint(0,5)
    if i == 2:
    	break
    print(i, end = '')

두 코드는 동일한 역할을 수행한다.

 

next(반복 가능한 객체, 기본값)

: 기본값을 지정하면 반복이 끝나더라도 StopIteration이 발생하지 않고 기본값을 출력할 수 있게 해줌.

 

 

p. 148

line 22

header = next(filereader)

어떻게 next 함수를 사용하여 헤더 행을 제거한건지 모르겠다.