본문 바로가기

프로그래밍/python

파이썬 pandas 기초 정리 DataFrame 수정하기..3

반응형

파이썬 pandas 기초 정리 DataFrame 수정하기..3

본 포스팅은 https://www.learndatasci.com/tutorials/python-pandas-tutorial-complete-introduction-for-beginners/ 를 참고하여 한국말로 재정리 한 포스트 입니다.

 

 

이전 포스트

 

DataFrame을 짜르고 선택하고 추출하기

지금까지 데이터를 기본적으로 요약하는 법에 대해 초점을 맞추었습니다. 하나의 column을 추출하고 null 값을 fillna()로 채워보기도 하였지요. 이제 그다음으로는 짜르고 선택하고 추출하는 법을 배워보겠습니다.

 

 

Column으로 짜르기

이전에 column을 추출했던 방식으로 type을 봐보겠습니다.

genre_col = movies_df['genre']
type(genre_col)

다음과 같이 Series형이라고 리턴됩니다. DataFrame으로써 column을 추출하려면 다음과 같이 하면 됩니다.

genre_col = movies_df[['genre']]
type(genre_col)

리스트형식이기에 다른 column도 같이 뽑는것은 쉽습니다.

subset = movies_df[['genre', 'rating']]
subset.head()

 

 

Row로 짜르기

row형으로 다음과 같이 두가지 옵션이 있습니다.

  • .loc - 이름으로 로케이트
  • .iloc - 인텍스로 로케이트

movie title로 여전히 인덱스하고 있다는것을 기억하고 있다면, movie title로 row를 추출할 수 있습니다.

prom = movies_df.loc["Prometheus"]
print(prom)

다른 방식으로 iloc 는 숫자형 인덱스로 Prometheus row 값을 추출할 수 있습니다.

prom = movies_df.iloc[1]

loc와 iloc는 파이썬은 list 슬라이싱과 비슷합니다. 여러개의 row들을 선택하려면 파이썬의 example_list[1:4]처럼 판다스에서 추출이 가능합니다.

movie_subset = movies_df.loc['Prometheus':'Sing']
movie_subset = movies_df.iloc[1:4]
print(movie_subset)

 

조건문으로 선택하기

column과 row를 조건형식으로 선택할려면 어떻게 해야할까요? 예를 들어 만약 movie DataFrame을 Ridley Scott감독이 맡은 작만 추출하고 싶다면 또는 rating이 0.8보다 높거나 비슷한 작들만 뽑고 싶다면?

 

그렇게 하기위해선 Boolean condition을 사용하면 됩니다.

condition = (movies_df['director'] == "Ridley Scott")
condition.head()

isnull()과 비슷하게 Series형으로 True또는 False를 리턴합니다.

 

Ridley Scott의 작품이 아닌 모든 영화들을 리스트형으로 뽑고싶다면 다음과 같이하면 됩니다.

movies_df[movies_df['director'] == "Ridley Scott"]

이번에는 숫자값으로 필터링하는 예입니다.

movies_df[movies_df['rating'] >= 8.6].head(3)

좀 더 효율적인 방법으로 logical operator or(|) and(&)를 사용할 수 있습니다.

Christopher Nolar OR Ridley Scott 감독만을 리스트로 뽑아보면 다음과 같습니다.

movies_df[(movies_df['director'] == 'Christopher Nolan') | (movies_df['director'] == 'Ridley Scott')].head()

또다른 방법으로 group evaluation 으로 inin() 메소드를 이용해 다음과 같이도 할 수 있습니다.

movies_df[movies_df['director'].isin(['Christopher Nolan', 'Ridley Scott'])].head()

여기서 좀 더 복잡하게 2005년부터 2010년까지 rating이 8.0이상인 하지만 수익이 25% 아래인 경우를 뽑아 보자면..

movies_df[
    ((movies_df['year'] >= 2005) & (movies_df['year'] <= 2010))
    & (movies_df['rating'] > 8.0)
    & (movies_df['revenue_millions'] < movies_df['revenue_millions'].quantile(0.25))
]

.describe() 메소드를 이용하여 25% 수익값은 17.4 였습니다. 그렇지만 여기서 quantile(0.25) 메소드를 이용하면 바로 거기에 맞는 값을 추출할 수 있습니다.

 

함수 적용하기

DataFrame과 Series를 반복하는 작업을 진행할 경우 특히 큰 데이터라면 느려질 수밖에 없습니다.

대안적으로 apply() 함수를 이용하면, 예를들어 rating이 8.0보다 높을 경우 good을 아니면 bad라는 것을 새로운 column으로 리턴하는 함수를 만들어 사용할 수 있습니다.

 

먼저 good 또는 bad를 리턴하는 함수를 만들어 보겠습니다.

def rating_function(x):
    if x >= 8.0:
        return "good"
    else:
        return "bad"

이제 전체의 column에 이 함수를 적용시켜 보겠습니다.

movies_df["rating_category"] = movies_df["rating"].apply(rating_function)
movies_df.head(2)

.apply() 메소드는 rating column을 rating_function을 이용해서 새로운 Series값을 추출합니다. 그리고 rating_category라는 새로운 column에 값을 넣어줍니다.

rating_function함수를 이용하는것 이외에 또다른 방법으로 lambda 함수를 이용하는 것입니다.

 

movies_df["rating_category"] = movies_df["rating"].apply(lambda x: 'good' if x >= 8.0 else 'bad')
movies_df.head(2)

 

apply()를 이용하면 순차적으로 row를 반복하면서 실행하는 것보다 빠릅니다. 그이유는 판다스는 vectorication를 이용하기 때문입니다.

Vectorization이란 각각의 요소로써 계산하는게 아닌 array로써 계산하는 것을 말합니다. 

 

반응형