본문 바로가기
Data Science/Data Science

[Data Science] CSV 데이터 읽고 처리하기

by m2162003 2021. 1. 19.

데과 수업 듣기 전에 이걸 들었더라면...

좀 더 과제가 쉽지 않았을까..

 

1. CSV 데이터

CSG 데이터는 Comma Separated Value, 즉 콤마로 나뉘어진 데이터 형식이다.

콤마가 data의 각 column을 가리킨다고 보면 된다. (콤마말고 다른 구분문자도 사용가능)

주로 엑셀 파일로 나타내며 용량이 작은 이점이 있다고 한다.

(json과 비교하면 용량이 작다는 걸 쉽게 확인할 수 있다.)

하지만 그만큼 데이터 오염이 쉽기 때문에 주의하자.

 

 

2. csv 데이터 읽기

파일을 열어서 csv 모듈을 사용한다. delimiter뒤에 구분자가 들어간다. 

import csv

with open('movies.csv') as file:
  reader = csv.reader(file, delimiter=',') # 구분자 delimiter
  for row in reader:
    title = row[0]
    author = row[1]
    pages = row[3] 
  

 

3. csv -> json 변환하기

csv를 읽어서 json으로 변환하는 실습을 진행했다.

books = []

# 1. csv 파일을 읽어옵니다.
with open(src_file) as src:
  reader = csv.reader(src, delimiter=',')
  
  # json 파일로 변환하기 위해 딕셔너리 형태로 만듭니다.
  for row in reader:
    book = {
      "title": row[0],
      "author": row[1]
    }
    books.append(book)
    
# json 형식으로 파일을 저장합니다.
with open(dst_file, "w") as dst:
  dst.write(json.dumps(books))

 

4. 람다 lambda 사용하기

lambda를 사용하면 간편하게 함수를 작성할 수 있다.

def square(x):
  return x*x
  
# 람다로 바꿔보자
square = lambda x: x*x

 

lambda 인수: f(x) 라는 걸 확인할 수 있다.


또 다른 예시1

get_eng_title = lambda row: row.split(',')[1]
sorted(movies, key=get_eng_title)

또 다른 예시 2

string의 첫 번째 글자를 리턴한다. 빈문자열이면 빈문자열 리턴

first_letter = lambda string: string[0] if string else ''

 

cf) assert(조건식)

조건식이 true이면 통과하지만 false이면 error를 발생시킨다.

 

 

5. 함수를 리턴하는 함수

파이썬에서 함수를 리턴하는 함수로는 map()과 filter()가 있다. 두 함수 모두 실행하면 리스트나 튜플 같은 자료 구조가 리턴되는 것이 아니라 함수가 리턴된다.

무슨 의미냐면 

eng_titles = map(get_eng_title, movies)
print(eng_titles)
# map object가 리턴된다.
# eng_titles[0]을 할 때 값이 리턴된다.

맵은 데이터가 필요해질 때 연산을 수행한다.

 

또 다른 예시로는 itemgetter가 있다.

itemgetter(n)은 n번째 값을 리턴하는 함수를 리턴한다.

>>> from operator import itemgetter
>>> get_zeroth = itemgetter(0) # 0번째 함수 리턴하는 함수 만들기
>>> numbers = [1, 2, 3]
>>> print(get_zeroth(numbers))
1

 

5-1. map()

map(func 매핑 함수, x 인풋) 형태이다.

앞에는 함수를 인자로 받고 뒤에는 함수에 들어갈 input을 인자로 받는다.

titles=[]
for row in reader:
  titles.append(row[0])
  
# map으로 구현
get_title = lambda row: row[0]
titles = map(get_title, reader)

직관적인 이해는 어렵지만 map을 사용하니 코드를 잘 짜는 것처럼 보인다.

 

5-2. filter()

filter(func 체크 함수, 체크할 인자 x)

is_long = lambda row: int(row[3]) > 250
long_books = filter(is_long, reader)

 

 

 

댓글