(BigData Analysis 도전기) Kaggle Pandas Tutorial (2. Indexing, Selecting & Assigning)
by 줌코딩
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
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Subscribe via RSS