Introduction

  • 여태까지는 어떻게 DataFrame과 Series에서 관련 정보를 가져올지에 대해 배웠다.
  • 이때 필요한 바른 정보를 끄집어내는 것은 매우 중요한 일이다.
  • 데이터를 뽑아낼 때 항상 데이터가 우리가 원하는 포맷으로 추출되지 않기 때문에 우리는 reformat하는 작업이 추가로 필요하다.
  • 이런 작업을 해주는 연산들에 대해서 배워보도록 하자.
  • 이번에도 Wine Magazine data를 활용하도록 하겠다.

Summary functions

  • Pandas는 다양한 간단한 “Summary Functions”를 제공한다.
  • describe()를 한번 보자.
reviews.points.describe()

count    129971.000000
mean         88.447138
            ...      
75%          91.000000
max         100.000000
Name: points, Length: 8, dtype: float64
  • 위와 같이 타입을 반영해서 이에 따른 요약 정보를 제공한다.
  • string에 대한 정보도 한번 보자.
reviews.taster_name.describe()

count         103727
unique            19
top       Roger Voss
freq           25514
Name: taster_name, dtype: object
  • 위와 같이 string에 맞게 총개수와 독특한 친구의 개수, 제일 많은 개수 등등을 보여준다.
  • 아예 특정 수치적인 정보에 대한 걸 확인하고 싶다면 그에 따른 pandas의 함수들이 있다.
  • 예를 들어 points의 mean을 찾고 싶다면
reviews.points.mean()

88.44713820775404
  • 깔끔하게 끝난다.
  • 그리고 문자열 중 unique한 친구들만 뽑아내고 싶다면 다음과 같이 할 수 있다.
reviews.taster_name.unique()

array(['Kerin O’Keefe', 'Roger Voss', 'Paul Gregutt',
    'Alexander Peartree', 'Michael Schachner', 'Anna Lee C. Iijima',
    'Virginie Boone', 'Matt Kettmann', nan, 'Sean P. Sullivan',
    'Jim Gordon', 'Joe Czerwinski', 'Anne Krebiehl\xa0MW',
    'Lauren Buzzeo', 'Mike DeSimone', 'Jeff Jenssen',
    'Susan Kostrzewa', 'Carrie Dykes', 'Fiona Adams',
    'Christina Pickard'], dtype=object)
  • 그리고 각 데이터가 얼마나 나왔는지 보고 싶다면 value_counts 함수를 이용하면 된다.
reviews.taster_name.value_counts()

Roger Voss           25514
Michael Schachner    15134
                    ...  
Fiona Adams             27
Christina Pickard        6
Name: taster_name, Length: 19, dtype: int64

Maps

  • 맵이란 수학에서 나온 용어로, 하나의 값들의 집합을 다른 값들의 집합과 연결시켜주는 것을 의미한다.
  • 데이터 과학에서는 자주 현재 데이터를 이용해 우리가 원하는 데이터 형태로 새로 만들어내는 과정이 필요하다.
  • Maps가 이러한 일을 해주기 때문에 나중에 매우 유용하게 쓰일것이다.
  • 우리가 쓸 mapping 함수는 크게 두가지가 있다.
  • 첫 함수는 map()으로 예제를 먼저 확인해보자.
  • 우리가 와인의 점수를 0으로 재평균화하고 싶다.
  • 그렇다면 다음과 같이 진행할 수 있다.
review_points_mean = reviews.points.mean()
reviews.points.map(lambda p: p - review_points_mean)
  • 미리 평균을 구해놓고, map을 이용해서 평균과의 차이값을 저장해주도록 한다.
  • map으로 전다로디는 것은 Series에서의 간단한 값을 변형된 값으로 return해준다.
  • apply() 함수도 우리가 DataFrame의 모든 row를 위한 함수를 만들어서 적용하고 싶다면 map과 똑같이 모든 값을 바꿔주는 역할을 한다.
  • 다음 예시를 보자.
def remean_points(row):
    row.points = row.points - review_points_mean
    return row

reviews.apply(remean_points, axis='columns')
  • 모든 row(record)의 points는 remean된다.
  • 이 때 axis를 ‘index’로 한다면 column을 위한 함수를 만들어야할 것이다.
  • map(), apply() 모두 새로운 형태의 series와 dataframes을 return한다.
  • 이때 원래의 series와 dataframes의 값은 변동되지 않는 특징을 가지고 있다.
  • 다음과 같은 과정을 진행하면 더 빠르게 remean을 할 수 있다.
review_points_mean = reviews.points.mean()
reviews.points - review_points_mean
  • 왼쪽 값에 같은 값을 계속 연산하도록 한다.
  • 다음과 같은 연산도 가능하다.
reviews.country + " - " + reviews.region_1

0            Italy - Etna
1                     NaN
            ...       
129969    France - Alsace
129970    France - Alsace
Length: 129971, dtype: object
  • 이 과정은 map이나 apply를 쓰는 것보다 훨씬 빠르다
  • 하지만 map이나 apply 만큼 flexible 하지 않기 때문에 advanced한 것을 하는게 아닐때만 사용하는 것이 좋을 것이다.
  • 이상으로 3번째 강의 정리를 마친다.
  • exercise 3도 진행해보자!