Today I Learned — DS — Weekend 1–2

배우는 자(Learner Of Life)
14 min readSep 6, 2020

--

판다들(Pandas)의 유용함

#Pandas, #Python

적어도 데이터 사이언스 분야에서 판다들( Pandas)은 무익한 존재들이 절대아니다

오늘 한일/배운 것:

어제까지 타이타닉을 다루어 보면서, 내가 생각보다 다루지 못한 것이 많았다. 그건 바로 Pandas라는 라이브러리다. 목요일 수업시간에 이 라이브러리를 잘 사용하는 것이 데이터 사이언스로써의 성공과 직결된다라는 말을 들은 것이 기억났다. 그래서, 오늘은 이 라이브러리에 대한 좋은 설명을 담은 자료를 찾아보았다. 결국, 유튜브에서 Corey Schafter라는 프로그래머의 Pandas 튜토리얼 시리즈를 찾을 수 있었다. (링크: https://www.youtube.com/watch?v=ZyhVh-qRZPA)

나는 이 시리즈를 따라 무작정 어제까지 한참 씨름했던 타이타닉데이터를 가지고 한번 따라해 보기로 했다. 좋은 설명을 잘 따라해보고, 나 스스로 내 방식대로 적용해보았다. 그 결과 오늘 이 라이브러리에 대한 몇가지 유용한 지식을 얻을 수 있었다.

먼저, 데이터에 대한 전반적인 정보를 얻을 수 있는 “info()” 기능에 대해 배울 수 있었다. 이 기능은 데이터가 전체적으로 어떠한 사이즈를 가지고 있으며, 각각의 데이터 칼럼의 타입이 어떤지를 보여주는 유용한 기능이었다. 이 기능을 어제 내가 다루던 데이터에 적용해 보면 아래와 같은 코드로 아래와 같은 아웃풋을 얻을 수 있다.

(참고로 이 medium에서 코드 스니핏을 넣고 싶다면 윈도우즈 사용자들은 Ctrl + Alt + 6, 맥OS 사용자들은 Cmd + Option + 6 을 누르면된다.)

titanic.info()
info() 기능을 통해 전반적인 데이터의 정보를 얻을 수 있다.

다음으로 데이터의 최대 디스플레이 사이즈를 조절할 수 있는 기능이다. set_option(“display.max_columns/rows”, n)의 문법을 활용할 수 있다. 예를 들면,

pd.set_option('display.max_columns', 5) # adjust the display of the dataframe of 5 columns
pd.set_option('display.max_rows', 10) # adjust the display of the dataframe of 10 rows

위와 같은 코드를 이용하여 아래처럼 최대 표현 칼럼의 수를 5개, 행(row)의 수를 10개로 제한 할 수 있다.

원래 데이터에서 인덱스를 제외한 5개의 칼럼을 디스플레이한 모습(데이터가 너무길면 자동으로 “…”으로 생략된다)

다음으로 불러온 데이터 안에서, 다시 원하는 부분을 새로운 데이터 프레임으로 만드는 법을 발견했다. 자신이 새로 데이터화 시킬 칼럼의 이름을 찾은 후, 데이터 프레임을 만들때, 전체 데이터에서 그 데이터만을 골라 생성하는 방법이다. 나의 경우 타이타닉 데이터에서 “Pclass”라는 데이터만을 보고 싶었다. 아래와 같은 코드를 통해 원하는 부분을 새로운 데이터로 추출할 수 있었다.

titanic_class = pd.DataFrame(titanic["Pclass"])
titanic_class
Pclass 데이터를 따로 독립된 데이터로 생성한 모습

또한 아래와 같이 데이터의 타입을 알 수 있는 type()기능을 배웠다.

type(titanic["Pclass"])
데이터의 타입은 “Series”이다.

Series는 하나의 데이터 칼럼과 하나의 인덱스 칼럼을 가진 자료구조이고, Dataframe은 결국 이들의 집합이라는 것이 둘의 유일한 차이라는 것이 내가 내린 결론이다. 즉, 나는 본래 Dataframe에서 Series를 새로 생성한 것이다.

또한, 이러한 indexing이외에도, 특정 데이터 칼럼을 “.<칼럼의 이름>”기능을 통해 접근할 수 있다는 것도 알게되었다. 예를 들어 위의 Pclass칼럼을 아래와 같이 접근할 수도 있다.

titanic.Pclass

위 코드의 아웃풋은 아래와 같다. 이번에는 데이터의 타입이 Series가 아닌 “int64”로 나오는 것을 알 수 있다. (즉, 이것은 정돈된 데이터 프레임이 아직 아니라는 것이다.)

이번에는 훨씬 덜 깔끔헤 보이는 int타입의 데이터가 나왔다.

또한, 하나이상의 데이터 칼럼 이름을 이용하여, 하나 이상의 시리즈를 가진 데이터 프레임을 만들어 볼 수 있다. 아래와 같이, 데이터안에 또하나의 대괄호를 통해 여러개의 데이터 칼럼에 접근한다는 표시를 해 주어야한다.

titanic[["Survived", "Pclass"]] # The multiple columns is a dataframe (no longer a series)
하나 이상의 시리즈를 가진 데이터프레임을 만들 수 있다.

혹시라도 내가 어떤 데이터를 접근해야할지 모른다면, 데이터의 모든 칼럼의 이름을 보여주는 아래와 같은 기능을 이용할 수 있다.

titanic.columns # display the columns of the dataframe
데이터의 모든 칼럼의 이름을 확인할 수 있다

이 과정의 처음 입문 과제를 받았을 때, iloc이라는 기능을 이용하여 특정한 데이터 칼럼에 접근할 수 있는 기능을 배웠다. 이번에는 조금 더 나아가서 특정 행의 특정 칼럼 데이터에 접근할 수 있는 방법까지 배우게 되었는데, 아래와 같은 코드를 통해 첫번 째와 두 번째 행의 데이터, 그 중에서도 세 번째 칼럼의 데이터를 접근하는 방법을 배웠다.

titanic.iloc[[0, 1], 2] # choose the 3rd column of the first two rows of the data
이름 데이터 칼럼의 첫 번째와 두 번째 행의 데이터 중, 세 번째 칼럼인 이름 정보를 띄운 모습

그러나 위의 iloc기능은 내가 데이터의 칼럼 정보를 완벽하게 숙지했을 때 의미가 있을 것이다. 내가 데이터의 특정 칼럼의 순서보다, 그 칼럼의 이름을 통해 세부적인 데이터에 접근하고 싶다면 loc기능을 사용할 수 있다. 데이터의 개수는, 대괄호안의 또 다른 대괄호내에서 얼마든지 원하는 만큼 칼럼데이터의 이름을 넣는 방법으로 표현할 수 있다.

titanic.loc[0:1, "Name": "Sex"] # access the multiple rows and a column (원하는 범위의 데이터를 지정할 수 있다.)# 또는titanic.loc[[0, 1], ['Name', 'Sex']] # must put the name of the column to access it (원하는 부분의 데이터를 일일히 나열할 수도 있다.)
loc기능을 통해 이름과 성별 데이터를 칼럼의 이름으로 접근한 모습

첫 입문 과제 때 배웠던 또 다른 기능 중에 하나가 “value_counts()라는 기능이었는데, 이를 이용하여 특정 칼럼의 사이즈를 알 수 있다는 것을 한번 더 복습할 수 있었다.

titanic["Sex"].value_counts()
value_count() 기능을 이용한 여성과 남성의 수

또한 데이터의 인덱스를 원한다면 다른 데이터 칼럼으로 바꿀 수 있는데, 아래와 같이 set_index()기능을 활용할 수 있다. 해당 데이터를 한번 바꾸는 것 만으로는 변경된 인덱스가 고정되지 않기 때문에, inplace파라미터를 True로 지정해주어야 한다.

titanic.set_index("Name", inplace=True)
titanic
set_index기능을 통해 데이터의 인덱스를 이름 정보로 교체한 모습

본래 데이터의 인덱스로 돌리고 싶다면, “reset_index()”기능을 활용하면 된다.

titanic.reset_index(inplace=True)

하나의 상황을 가정해보자, 만약 내가 특정한 승객의 정보를 보고 싶다면 어떻게 해야 할까? 아래와 같이 loc.기능을 이용하여, 특정인에 대한 정보를 확인할 수 있다.

titanic.loc["Mr. Johann Markun", "Age"] # accessing the specific information of associated with the index
loc기능을 통해, Mr. Johann Markun의 나이 정보를 확인할 수 있다.

만약, 데이터를 처음 불러올 때부터 특정한 데이터의 칼럼을 인덱스로 사용하고 싶다면, read_csv를 통해 데이터를 불러올 때, index_col 파라미터를 원하는 칼럼의 이름으로 지정해 줄 수 있다.

titanic = pd.read_csv("https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv", index_col = "Name")titanic
데이터를 처음 불러올 때부터 인덱스 칼럼을 지정가능하다.

만약, 위의 이름 컬럼 데이터를 정렬하여 보고싶다면, sort_index()기능을 활용할 수 있다. ascending파라미터를 False로 설정하면, 내림차순으로 데이터를 볼 수 있다.

titanic.sort_index(inplace=True, ascending=False) #permanently sorting the index in descending ordertitanic
데이터를 인덱스의 알파벳 내림차순으로 재정렬한 모습

특정 데이터 칼럼을 기준으로, 특정 조건에 만족하는 데이터만을 보고 싶다면, 아래와 같은 필터링 기법을 사용할 수 있다.

#Filtering datafiltered = (titanic["Sex"] == "female") #filt is used in python already (parentheses is for readability)titanic[filtered] #better to read
승객들 중 여성의 데이터만을 추린 모습

여기서도 loc기능을 이용하여, 더 세부적인 데이터를 볼 수 있다. 현 데이터에서 성별 정보만을 표시하고 싶을 경우, loc내에서 추가적인 칼럼 데이터의 이름을 표기하면 된다.

titanic.loc[filtered] #Same operation using loctitanic.loc[filtered, "Sex"] #only get the sex information from the filtered data
승객들 중 성별 데이터만을 추린 모습 (이름 데이터는 인덱스로 설정되었으므로, 반드시 있어야 한다)

“&(and)” 및 “|(or)” 을 활용하면 필터링을 좀 더 세분화할 수 있다. 아래와 같이 생존자들 중 성별이 여성인이들의 정보를 볼 수 있다.

# &: and, |: orfiltered = (titanic["Survived"] == 1) & (titanic["Sex"] == "female")titanic.loc[filtered, "Sex"] #Only displaying female of the survivors
생존자들 중 여성들의 정보만을 추린 모습

아래는 모든 생존자 + 모든 여성 승객들을 보여주는 데이터이다. “|(or)”을 사용하면, 교집합이 아닌 합집합이된다.

filtered = (titanic["Survived"] == 1) | (titanic["Sex"] == "female")titanic.loc[filtered, "Sex"]
“|” 기능을 쓰면 합집합의 데이터를 만들 수 있다.

만약, 내가 지정한 필터링 조건에 반하는 것들만을 표현하고 싶을 경우, 단순히 “-” 부호를 사용하면 된다.

filtered = (titanic["Survived"] == 1) & (titanic["Sex"] == "female")titanic.loc[-filtered, "Sex"] #Only displaying male of the deaths
“-” 부호는 내가 설정한 조건에 반대되는 조건을 사용하여 필터링할 수 있게 해준다.

또한 비교 연산자인 “<” 및 “>”를 사용할 수도 있다. 예를 들어 승객 중 100파운드 이상을 지불한 이들만을 보고 싶다면, 아래와 같은 코드를 사용할 수 있다.

high_fare = (titanic["Fare"] > 100)titanic[high_fare] #notice that the filtered people are all first class(Pclass = 1)
생존자 중 100파운드 이상의 요금을 지불한 이들만 나타낸 데이터 (모든 이들이 First Class[Pclass = 1]인 것이 흥미롭다)

또한, 특정 내용을 가지고 있는 데이터를 검색하고 싶을 경우, 아래와 같이, 원하는 내용을 변수에 지정한다. 그리고 “isin()” 기능을 이용하여, 이 내용이 내가 보고자 하는 데이터 칼럼에 존재하는지 확인할 수 있다.

Pclass = ('2', '3')filtered_class = titanic["Pclass"].isin(Pclass)titanic.loc[filtered_class]
Pclass가 2나 3인 승객들만 추린 모습, 요금(Fare)이 대부분 30을 넘지 않는다.

위 정보에서 다시 몇 개의 칼럼으로 세분화 하고 싶다면, 다시 한번 loc 기능을 사용하고, 원하는 데이터 칼럼들의 이름을 또 다른 대괄호안에 지정해준다.

titanic.loc[filtered_class, ['Pclass', "Fare"]]
Pclass가 2나 3인 승객들의 요금 정보까지만을 표현한 모습

마지막으로, 긴 문자(string)을 가진 정보에서, 특정 부분적인 단어를 가진 데이터만을 추리고 싶은 경우가 있을 수 있다. 예를 들어, “John” 이라는 이름이나 성을 가진 승객들의 데이터를 보고 싶을 경우가 있을 수 있다. 이를 위해 str. contains를 활용할 수 있다. 데이터에 “NaN”이라는 무의미한 데이터가 있는 경우 na파라미터를 False로 설정하여 무시할 수 있다. 먼저, 데이터가 본래의 숫자 인덱스를 가질 수 있도록 reset_index()기능을 활용하자.

titanic.reset_index(inplace=True)filtered_John = titanic["Name"].str.contains('John', na=False)titanic.loc[filtered_John, "Name"]
John 이라는 이름이나 성을 가진 승객들의 이름만을 추린데이터, 52명이나 된다니!

내일할 일:

오늘 쓴 내용이 매우 많게 느껴지지만, 사실 내가 실질적으로 많이 배운 내용은 많지 않았다. 조금 더 시간을 썼다면 하는 아쉬움이 느껴진다. 오늘 새로운 것을 배웠다는 것에 만족하고 내일 있을 강도 높은 시작을 위해 심적으로 준비해야 하는데, 얼마나 힘들지 걱정반, 기대반이다. 또한 이제는 이번 주 만큼 긴 글을 쓰기위한 시간을 투자할 수 없을 수도 있다는 점이 매우 아쉽다. 앞으로는 양이 조금 적더라도, 내가 배운 내용의 핵심을 기록할 수 있어야 할 것 같다. 오늘까지 내가 쓴 내용이, 내 글을 보는 동료들에게 도움이 되었으면 좋겠다. 내일부터 있을 일을 걱정해봐야 달라질 것은 없으니, 어차피 피할 수 없으면 즐겨야지. 내가 이제부터 무엇을 배울지 기대된다!

참조:

https://www.youtube.com/watch?v=ZyhVh-qRZPA << 강력추천!

--

--

배우는 자(Learner Of Life)
배우는 자(Learner Of Life)

Written by 배우는 자(Learner Of Life)

배움은 죽을 때까지 끝이 없다. 어쩌면 그게 우리가 살아있다는 증거일지도 모른다. 배움을 멈추는 순간, 혹은 배움의 기회가 더 이상 존재하지 않는 순간, 우리의 삶은 어쩌면 거기서 끝나는 것은 아닐까? 나는 배운다 그러므로 나는 존재한다. 배울 수 있음에, 그래서 살아 있음에 감사한다.

No responses yet