Introduction

  • Pandas의 Dataframe이나 series에서 특정 값을 가져오는 것은 모든 Data 연산에서 하게 될 일이다.
  • 여기서 중요한 것은 너와 관련된 데이터를 어떻게 빠르고 효율적으로 가져올 것인가이다.

Naive accessors

  • 파이썬 자체가 data를 indexing하는 좋은 방법을 제시하고 있다. Pandas는 거기에 추가적인 기능을 제공하고 있다.
  • 13000개의 row와 13개의 column을 가지고 있는 Review라는 DataFrame을 생각해보자.
  • 파이썬에서는 object의 property에 접근하기 위해서는 attribute 사용하면 됐다. 예를 들어 book이라는 object에 title이라는 attribute가 있다면 book.title로 접근하면 됐다.
  • Pandas도 마찬가지이다. reviews에 있는 contry라는 property에 접근하고 싶다면 다음과 같이 하면 된다.
reviews.country
  • 결과값은 다음과 같다.
0            Italy
1         Portugal
            ...   
129969      France
129970      France
Name: country, Length: 129971, dtype: object
  • python에서 dictionary를 사용할때는 []에 값을 넣어서 indexing하기도 한다. DataFrame에서도 가능하다.
reviews['country']
  • 결과는 reviews.country와 동일하다.
  • DataFrame에서 특정 Series를 선택하는 방법은 이렇게 두가지가 있다.

Indexing in pandas

  • 초심자에게 이러한 방법은 사용하기 굉장히 쉬울 수 있다.
  • 하지만 pandas는 여기에 추가적인 접근 연산방법을 가지고 있다.(loc, iloc)
  • 아마 여러분도 이 연산 방법을 사용하게 될 것이다.

Index-based selection

  • Pandas indexing는 두가지의 패러다임에 의해 작동한다.
  • 첫번째는 index-based selection이다.
  • 이 방법은 data를 숫자적인 위치에 의해 찾는 것이다.
  • 이 방법을 사용한 것이 iloc이다.
  • DataFrame에서 첫째 record를 가져오고 싶다면 다음과 같이 할 수 있다.
reviews.iloc[0]
  • 그 결과는 다음과 같다.
country                                                    Italy
description    Aromas include tropical fruit, broom, brimston...
                                    ...                        
variety                                              White Blend
winery                                                   Nicosia
Name: 0, Length: 13, dtype: object
  • loc, iloc 모두 row-first, column-second이다. 그러므로 파이썬과 살짝 반대인 것을 볼 수 있다.
  • 그렇다면 iloc을 써서 column을 가져오려면 어떻게 해야할까?
reviews.iloc[:, 0]
  • 그냥 : 연산자를 넣으면 된다. 이것은 everything을 의미한다.
  • 이 때 : 연산자는 범위를 의미하기도 한다.
reviews.iloc[:3, 0]
  • 위의 값은 다음과 같이 처음부터 3번까지의 row의 첫 col의 값을 의미한다.
0       Italy
1    Portugal
2          US
Name: country, dtype: object
  • 또한 list를 전달할 수도 있다.
reviews.iloc[[0, 1, 2], 0]
  • 뿐만 아니라 음수값도 사용될 수 있다. 이때는 뒤에서부터 counting이 시작된다.
  • 만일 뒤의 5개부터 보여주고 싶다면 다음과 같이 할 수 있다.
reviews.iloc[-5:]

Label-based selection

  • 두번째 패러다임은 label로 찾는 것이다. 이는 loc 연산자로, 각 원소의 위치가 아닌 index value로 검색하게 된다.
  • 다음과 같이 할 수 있다.
reviews.loc[0, 'country']
  • 이 때는 0번째 row의 country attribute을 보여주게 된다.
  • 또한 다음과 같은 연산이 가능하게 된다.
reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]

Choosing between loc and iloc

  • iloc과 loc은 조금 다른 indexing 방법을 가지고 있다는 걸 기억 해야한다.
  • iloc은 파이썬과 같은 방법을 쓰고 있다. 0:10이면 0~9까지 인덱싱을 하게 되고 loc은 반면에 0:10이면 0~10까지 인덱싱을 한다.
  • 0:1000을 통해 1000개의 데이터를 얻고 싶으면 iloc을 1001개를 얻고 싶으면 loc을 사용하면 된다.

Manipulatting the index

  • label based selection에서 index는 불변하지 않다.
  • index는 우리가 바꿔쓸 수 있다.
  • set_index() 함수를 사용하면 새로운 index가 생성된다.

Conditional selection

  • 여태까지는 우리는 indexing의 방법에 대해서 알아봤다.
  • 이 데이터를 가지고 흥미로운 일을 하기 위해서는 조건에 따라 질문할 수 있어야 한다.
  • 예를 들어, 와인이 이탈리아 산인지 확인해보도록하자.
reviews.country == 'Italy'
  • 이 질문에 대한 답을 다음과 같은 결과로 얻을 수 있다.
0          True
1         False
        ...  
129969    False
129970    False
Name: country, Length: 129971, dtype: bool
  • 이렇게 bool 형태로 결과값을 얻어낼 수 있게 되는데 이를 loc에 넣어 데이터를 뽑아낼 수도 있다.
reviews.loc[reviews.country == 'Italy']
  • 위의 값을 통해서 나라가 italy인 record만 뽑아낼 수 있게 된다.
  • 다음과 같이 여러 조건을 동시에 배치 시킬 수도 있다.
reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)]
  • 또한 연산자를 통해서 둘중 하나가 성립한 경우를 다 보여줄수도 있다.
reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)]
  • isin 이라는 것을 이용하면 해당 값을 포함하는 애들만 추출해낼 수도 있다.
reviews.loc[reviews.country.isin(['Italy', 'France'])]
  • 그밖에도 isnull, notnull과 같은 조건을 통해서 값을 발견할 수도 있다.

Assigning data

  • 각 record에 값을 주는 방법은 간단하다.
  • 다음과 같이 그냥 constant한 값을 전달해주는 방법이 있고
reviews['critic'] = 'everyone'

0         everyone
1         everyone
            ...   
129969    everyone
129970    everyone
Name: critic, Length: 129971, dtype: object
  • 모두 순환적인 값을 전달해주는 방법이 있다.
reviews['index_backwards'] = range(len(reviews), 0, -1)
reviews['index_backwards']

0         129971
1         129970
        ...  
129969         2
129970         1
Name: index_backwards, Length: 129971, dtype: int64
  • 이상으로 두번째 강의 정리를 마치겠다.
  • 두번째 강의도 exercise를 통해 배운 내용을 연습해보자!
  • Exercise2