https://www.kaggle.com/residentmario/indexing-selecting-assigning
0. Python 기본 접근자
DataFrame의 각 column에 접근할 수 있는 방법은 여러가지가 있다. 그 중, 파이썬이 기본적으로 제공하는 2가지 방법에 대해서 먼저 알아보자.
첫번째 방법으로, DataFrame의 column index를 하나의 attribute로서 접근하는 방법이다. 이 방법으로 위의 DataFrame의 country
column에 reviews.country
코드를 통해 접근할 수 있다.
reviews.country
0 Italy
1 Portugal
...
129969 France
129970 France
Name: country, Length: 129971, dtype: object
두번째는 파이썬 딕셔너리에서 indexing operator([]
)로 value 값을 가져오는 것과 동일한 형식으로 접근하는 방법이다. DataFrame에서도 column index를 key처럼 사용하여 해당 인덱스의 열을 가져올 수 있다.
reviews['country']
0 Italy
1 Portugal
...
129969 France
129970 France
Name: country, Length: 129971, dtype: object
두 방법 모두 동일한 문법적 효력을 가지므로 둘 중에 본인에게 더 착착 감기는 방법을 사용하면 된다. 다만 첫번째 방법(reviews.country
)는 column index에 공백 문자나 예약어가 들어가있는 경우(e.g. country providence) 작동하지 않으므로, 이 경우에는 무조건 두번째 방법(reviews['country']
)를 사용해야 한다.
위의 방법을 통해 한 번 걸러진 데이터에서 []
연산자를 한 번 더 사용하면 특정한 하나의 값만 가져올 수도 있다.
reviews['country'][0]
'Italy'
1. Pandas 접근자
Pandas에도 접근 연산이 가능한 loc
, iloc
이 있다. (원문에는 얘네가 operators라고 되어 있는데, 얘네가 함수인지 연산자인지는 잘 모르겠다) 여기서 주의해야 할 점이 있는데, 보통 Python에서는 column-first, row-second를 따르는 반면 loc
과 iloc
는 row-first, column-second를 따른다는 것이다. []
안에서 첫번째로 오는 것이 행 선택자고, 두번째로 오는 것이 열 선택자임을 기억하자.
인덱스 기반 선택
Pandas의 인덱싱은 2가지 패러다임으로 동작하는데, 첫번째가 인덱스 기반 선택이다. 데이터의 수적 위치에 기반하여 데이터를 선택하는 것이며, iloc
이 이 패러다임을 따른다.
아래 코드는 iloc
을 사용해 DataFrame의 첫번째 행을 가져오는 예시다.
reviews.iloc[0] # row-first이므로 0번째 Row를 가져온다.
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을 따르므로 column 한 줄을 가져오는 것은 row 한 줄을 가져오는 것보다 조금 복잡하다.
reviews.iloc[:, 0] # ':'는 전체를 의미한다.
0 Italy
1 Portugal
...
129969 France
129970 France
Name: country, Length: 129971, dtype: object
x:y
는 x번째 값부터 y-1번째 값까지를 의미한다. 이 부분을 잘 이용해서 슬라이싱하면 된다.
레이블 기반 선택
loc
연산은 데이터의 위치 값이 아닌 인덱스 값으로 접근하는 레이블 기반 선택을 바탕으로 한다.
reviews.loc[0, 'country']
배열을 통해 여러 열을 선택할 수도 있다.
reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']]
loc
과 iloc
의 차이점
iloc
는 파이썬의 기본 인덱싱 방법을 따른다. 즉, 0:10
은 0부터 9까지의 엔트리를 선택한다. 반면에 loc
은 예외적으로 0:10
이 0부터 10까지의 엔트리를 선택한다.
이런 차이가 있는 이유는 loc
이 string 등을 포함한 다른 모든 stdlib 타입으로 인덱싱할 수 있기 때문이다. 숫자 인덱스를 입력받는 iloc
에서는 필요한 부분의 시작부터 (끝-1)까지 작성하는 것이 어려운 일이 아니다. 그냥 원하는 범위의 끝 숫자에서 1만 빼주면 되기 때문이다. 하지만, 예를 들어, 나에게 야채 이름을 인덱스로 가지는 DataFrame이 있고, 여기서 Apples부터 Potatoes까지의 열들을 loc으로 가져오고 싶은 상황이라고 해보자. 만약 loc
가 iloc
과 같은 인덱싱 매커니즘을 가졌다면 우리는 Potatoes의 다음 column index의 이름을 알아야 하는 수고가 필요하다.
2. 인덱스 조작하기
레이블 기반 선택의 힘은 인덱스에 붙은 레이블에서 오지만, 이 인덱스도 우리 입맛대로 바꿀 수 있다.set_index(keys)
메서드를 통해 기존 DataFrame의 열 중 하나를 인덱스로 설정할 수 있다. keys 자리에 인덱스로 설정하길 원하는 열의 레이블 이름을 적으면 된다.
reviews.set_index("title")
3. 조건부 선택
간단한 비교문을 통해 조건에 해당하는 열들은 True, 해당하지 않은 열에 False 값을 갖는 Series를 얻을 수 있다.
reviews.country == 'Italy'
0 True
1 False
...
129969 False
129970 False
Name: country, Length: 129971, dtype: bool
이렇게 각 레코드의 country 값을 기반으로 생성된 boolean 값을 갖는 Series를 loc
과 함께 사용하면 특정 데이터만 뽑아올 수 있다. 아래와 같이 코드를 작성하면 country 열의 값이 'Italy'인 레코드만 추출할 수 있다.
reviews.loc[reviews.country == 'Italy']
조건문과 함께 앰퍼샌드(&
)와 파이프(|
)를 사용할 수도 있다.
reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)]
reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)]
Pandas 내장 조건부 선택자 중 하나인 isin
을 사용할 수도 있다. 리스트 중 포함하고 있는 값이 있는 레코드를 선택할 수 있다. 아래는 isin
으로 country 항목에서 Italy나 France를 포함한 레코드를 추출하는 코드다.
reviews.loc[reviews.country.isin(['Italy', 'France'])]
또다른 Pandas 내장 조건부 선택자로 isnull
, notnull
이 있다. 이 메서드들은 NaN이거나, NaN이 아닌 레코드들만 가져온다.
reviews.loc[reviews.price.notnull()]
reviews.loc[reviews.price.isnull()]
4. 데이터 할당
DataFrame에 상수값이나 iterable을 할당할 수 있다.
reviews['critic'] = 'everyone'
reviews['critic']
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
'Machine Learning > Pandas' 카테고리의 다른 글
[kaggle courses] Pandas - Renaming and Combining (0) | 2021.10.19 |
---|---|
[kaggle courses] Pandas - Data Types and Missing Values (0) | 2021.10.18 |
[kaggle courses] Pandas - Grouping and Sorting (0) | 2021.10.16 |
[kaggle courses] Pandas - Summary Functions and Maps (0) | 2021.10.15 |
[kaggle courses] Pandas - Creating, Reading and Writing (0) | 2021.10.14 |