Programming/python

Udemy Python Boot Camp Section 25 정리 | CSV 데이터와 Pandas 라이브러리

자히Zahi 2024. 12. 16. 14:33

* 이 글은 필자가 자신이 배운 내용을 정리하기 위한 것이며, 결코 Udemy 강의를 결제하지 않은 타인의 학습을 고려하여 작성되지 않았습니다.

* 이 글을 학습에 활용하기를 원하신다면, Udemy에서 '[한글자막] Python 부트캠프 : 100개의 프로젝트로 Python 개발 완전 정복' 강의를 구매하시는 것을 권장드립니다.

 

 

CSV는 Comma-Separated Values의 약자로, 직역하면 반점으로 구분된 값들이라는 뜻이다.

csv 데이터는 행과 열로 이루어져있는 표 형태의 데이터에 자주 사용될 수 있으며, 이를 분석하기 위한 csv라는 모듈도 존재한다.

 

csv.reader("파일명.csv")를 하면 csv 파일의 각 열을 리스트 형태로 전환한다.

 

하지만 복잡한 표 데이터는 csv로 분석하기 힘들기 때문에 (가능은 하나 번거롭고 코드가 복잡해질 것이다.) Pandas 라이브러리를 사용한다.

 

pandas documentation — pandas 2.2.3 documentation

API reference The reference guide contains a detailed description of the pandas API. The reference describes how the methods work and which parameters can be used. It assumes that you have an understanding of the key concepts.

pandas.pydata.org

강사님께서 추천해주신 사이트이다. Pandas를 이용하기 전이나 이용 중에 궁금한 점이 있다면 이 사이트를 참고하자.

 

Pandas의 몇가지 기능에 대해 잠시 소개하자면, Pandas를 이용하면 표를 예쁘게 출력할 수도 있고

 

여기에서 한 열만 가져올 때에도 쉽게 할 수 있다. 만약 표에서 온도만 가져오고 싶다면

import pandas

data = pandas.read_csv("weather_data.csv")
print(data["temp"])

 

이 정도의 짧은 코드만으로도 기능을 구현할 수 있다. 비슷한 방법으로 temp의 유형 또한 확인할 수 있다.

 

pandas 자료에서 series란, 한 열을 말한다. 위의 이미지를 기준으로 하면 day열, temp열, condition열이 각각의 series가 될 수 있다. DataFrame이란 그러한 열들이 모인 표 전체를 말한다.

 

series로 할 수 있는 다양한 일을 보고싶다면, pandas documentation -> API reference에 들어가면 된다.

constructor에 있는 conversion란을 이용하면 pandas series나 dataframe을 다른 형태의 자료로 바꿀 수 있다.

만약 temperature과 같은 정수/실수형 데이터의 평균을 구하고 싶다면, 따로 리스트로 바꾸어 sum과 len을 사용할 필요 없이 mean()메소드를 사용할 수 있다. API reference를 공부하면 mean 외에 더 많은 메소드를 알 수 있을 듯하다. (ctrl+f를 사용하여 필요한 기능이 있을 때 서치하도록 하자. 혹은 구글링을 해도 좋다.)

 

위 코드에서의 data["temp"]는 data.temp로도 작성할 수 있다. 기능에는 큰 차이가 없지만, 전자는 해당 열을 딕셔너리 취급하는 것에 가깝고 후자는 해당 열을 객체취급하는 것에 가깝다고 한다. 음... 난 초보니까 그냥 넘어가겠다.

 

열이 아닌 행을 원한다면 어떻게 할까?

예를 들어, 월요일인 날의 데이터만을 원할 경우에는 어떻게 하면 좋을까?

import pandas

data = pandas.read_csv("weather_data.csv")
mon_data = data[data.day == "Monday"]

print(mon_data)

 

처럼 작성할 수 있다. index에 조건문을 넣는 느낌인데, 보이는 그대로 해석하면 요일이 월요일인 날에서의 데이터... 정도이다.

이 코드를 실행하면 다음과 같은 구문이 출력된다.

 

파이썬 안에서 pandas DataFrame을 만들기 위해서는 dictionary를 활용할 수 있다. (python bootcamp section 9 정리 글 참고)

import pandas

data_dict = {
    "students" : ["미림", "피자나라감자도둑", "당밀"],
    "score" : [85, 30, 98]
}

pan_data = pandas.DataFrame(data_dict)

 

딕셔너리 배워서 어떻게 쓰냐!!! 했는데 pandas에 쓰였다. 아하...

만약 이렇게 만든 데이터프레임을 csv 파일로 저장하고 싶다면

(DataFrameName).to_csv((PathName))라는 코드를 작성하면 된다.

(DataFrameName)에는 위에 있는 pan_data와 같은 DataFrame 유형 변수명을 넣으면 되고, (PathName)에는 파일을 저장할 경로를 넣으면 된다. 이때 경로란에 "path.csv"를 적으면 (큰따옴표를 포함한다.) 현재 폴더에 path라는 이름의 csv파일이 생긴다.

 

DataFrame의 열 개수를 알기 위해서는 df.size를 하면 된다.

행의 개수를 알기 위해서는 강의처럼 len 함수를 사용할 수도 있지만 (pandas library 속 함수가 아닌 python 내장 함수이다.) df.shape[0]을 사용할 수도 있다.

 

강의의 미국 주 파트 게임 만들기는 if문을 사용해 주 목록에 해당되는 주가 있는지 알아내는 방법도 있지만, try except를 이용할 수도 있다.

내가 객체지향 프로그래밍을 연습할 겸 작성한 코드인데, 강의와는 꽤 다른 부분이 있어 참고가 될까 올려본다.

혼자서 이 과제를 끝내고 싶은 사람에게는 접은 글을 펼치지 않는 것을 추천한다.

 

더보기

강의에서는 .title()로 맨 첫 글자를 대문자로 바꾸었지만, 필자는 더욱 직관적인 코드를 위해 .capitalize()를 사용하였다.

title함수는 단어별 맨 첫 글자를 대문자로 바꾸지만 capitalize는 전체 문구의 맨 첫 글자만을 대문자로 바꾸므로 title()을 사용하는 것이 적합하다. (Arizona로만 테스트 했어서 몰랐다.)

참고로 아래는 capitalize가 title로 수정된 코드이다.

 

하지만 아래 코드는 내가 설명을 잘못 이해해 주의 이름뿐만 아니라 좌표도 포함된 코드이므로 그 점을 참고하기 바란다.

import turtle
import pandas as pd

class State(turtle.Turtle):
    def __init__(self, name, x, y):
        super().__init__()
        self.penup()
        self.hideturtle()
        self.goto(x, y)
        self.write(name, align="center", font=("Arial", 8, "normal"))

screen = turtle.Screen()
screen.title("U.S. States Game")
image = "blank_states_img.gif"
screen.addshape(image)
turtle.shape(image)

data = pd.read_csv("50_states.csv")
correct_state_list = []

count = 0
while count < 50:
    try :
        answer_state = screen.textinput(title=f"{count}/50 States Correct", prompt="What's another state's name").title()

        if answer_state == "Exit":
            break

        current_state = data[data["state"] == answer_state]
        correct_state_list.append(current_state)

        State(answer_state, int(current_state["x"].iloc[0]), int(current_state["y"].iloc[0]))

        count += 1
    except IndexError:
        pass

for state in correct_state_list:
    data.drop(state.index, inplace=True)

data.to_csv("states_to_learn.csv")

 

이번 글은 여기서 끝... 최근에 쓴 다른 글에 비해 분량이 많다.

내 입시는 망했지만 그것 또한 나의 업보겠거니 하고 살아야지....

다들 좋은 하루 보내길