본 포스트의 내용은 아래의 Kaggle Pandas Tutorials Course의 각 step에 대해 공부한 것을 바탕으로 합니다.
https://www.kaggle.com/code/residentmario/indexing-selecting-assigning
1. Native accessors(Native Python)
pandas에서 제공하는 기능을 사용하지 않고 Python 문법만 이용해서 DataFrame의 특정한 Series를 인덱싱하는 방법은 두 가지이다.
reviews라는 이름의 아래와 같은 구성을 가진 DataFrame이 있다고 하자.
방법 1) attribute selection: df.column명
reviews.country
위와 같이 작성하면 DataFrame의 country 열에 접근할 수 있다.
방법 2) indexing operator: df['column명']
또한 Python에서 딕셔너리 자료형에서 인덱싱을 하는 것처럼 [] 연산자를 사용하면 column의 값에 접근할 수 있다. 아래의 코드도 위와 같은 결과를 보여준다.
reviews['country']
그리고 column 뿐 아니라 row까지 특정하고 싶다면, [] 연산자를 한 번 더 사용해주면 된다. [] 안에 행의 index 번호를 적는다. (열과 행의 순서에 주의한다. [][]에서 첫 번째 괄호는 column에 해당하고 두 번째 괄호는 row에 해당한다.)
reviews['country'][0]
둘 다 같은 기능이지만 두 번째 방법을 더욱 범용적으로 사용할 수 있다. 만약 column의 이름에 띄어쓰기와 같은 문자가 존재한다면 첫 번째 방법은 사용할 수 없기 때문이다.
따라서 indexing operator []를 이용하는 두 번째 방법을 주력으로 사용하는 것이 좋다.
⚠️Native Python과 Pandas에서 행열 표기 순서 차이
초보자가 가장 헷갈리기 쉬운 부분이 바로 이곳이다. 사소해서 놓치기 쉬운데 모르면 매우 혼란스러울 수도 있다.
반드시 알아두어야 할 것은 pandas와 native python의 행과 열을 적는 위치가 반대라는 것이다.
우선 native python은 앞에서 보았듯이 [][] 연산자를 사용할 때, 첫 번째 괄호에 column에 대한 것을 넣고 두 번째 괄호에 row에 대한 것을 넣었다. 즉, column-first, row-second이다.
반면에 Pandas는 이와 완전히 반대이다. [][] 연산자를 사용할 때, 첫 번째 괄호에 row에 대한 것을 넣고 두 번째 괄호에 column에 대한 것을 넣는다. 즉, row-first, column-second이다. 이는 곧 열에 대한 정보를 입력하지 않고 행에 대한 정보만 입력해도 되기 때문에 행을 검색하는 것이 열을 검색하는 것보다 쉽다는 것을 뜻한다.
Pandas의 경우,
row-first, column second
이고 native Python의 경우 그 반대라는 것을 반드시 알고있도록 하자.
2. Pandas로 Indexing
Pandas에서는 loc과 iloc이라는 독자적인 accessor operator를 제공한다. 초보자보다 데이터를 다루는 데 좀 익숙해진 사람이라면 이 loc과 iloc을 사용하는 것이 더 효율적이다.
Pandas는 두 가지 패러다임을 기준으로 loc과 iloc이라는 데이터 인덱싱 기능을 제공한다.
1. Index-based selection: iloc
index-based selection은 데이터의 numerical position를 기준으로 selecting을 하는 방법이다. iloc이 여기에 해당한다.
df.iloc[row pos][col pos]
위와 같이 표현한다.
아래와 같은 명령어를 사용해 다음의 데이터를 가져올 수 있다.
df.iloc[:, 0]
':'는 "모든 것"을 의미하는 native Python에서도 사용하는 연산자이다. 따라서 위의 코드는 모든 행의 0번째 열을 가져오는 것이다.
':' 연산자는 범위를 나타낼 때도 사용할 수 있다.
- [:] - 모든 것
- [:3] - 3 앞까지 다 (0, 1, 2)
- [1:3] - 1부터 3 앞까지 다 (1, 2)
- [-5:] - 끝에서부터 앞으로 5개
2. label-based selection: loc
label-based selection은 데이터의 postion이 아니라 데이터의 인덱스 값을 기준으로 selecting을 하는 방법이다. loc이 여기에 해당한다.
df.loc[row data][col data]
위와 같이 표현한다.
아래와 같은 명령어를 사용해 다음의 데이터를 가져올 수 있다.
df.loc[0, 'country']
위 코드는 row 데이터의 인덱스 값이 0이고 column 데이터의 인덱스 값이 'country'인 값을 가져온다.
iloc은 위치에 따라 index를 생성해야 하는 dataset을 다룰 때 주로 사용한다.
loc은 인덱스의 정보를 사용해서 작업한다.
데이터는 주로 유의미한 인덱스를 가지고 있으므로 loc을 사용해서 데이터를 다루는 편이 더욱 수월하다.
⚠️iloc과 loc의 인덱싱 방법 차이
iloc과 loc을 사용할 때 염두해야 할 점이, 이 둘은 인덱싱 했을 때 범위가 다르단 것이다.
iloc은 범위의 시작이 포함되고 끝이 제외되는 반면에, loc은 시작과 끝을 둘다 포함한다.
즉, 0:10을 했을 때에 iloc은 0~9인 반면, loc은 0~10을 선택한다.
3. 인덱스 manipulate
set_index()
DataFrame에 set_index() 속성을 이용하면 column 중에 원하는 인덱스를 이용해 데이터셋을 정렬할 수 있다.
이때 주의해야 할 점은 해당 인덱스는 column에서 사라진다는 것이다. 따라서 DataFrame의 구조가 바뀌게 되므로 데이터 처리에 오류가 발생하지 않도록 유의해야 한다.
df.set_index("title")
4. 조건으로 선택하기
DataFrame의 구조적인 특징이 아니라 데이터 값에 조건을 따라 데이터를 선택할 수도 있다.
1) True/False booleans
아래의 코드는 DataFrame의 country가 Italy에 해당하는지 따져보고 True or False로 구성된 Series를 반환한다.
df.country == 'Italy'
위 코드를 loc의 [] 연산자 안에 사용하면 'Italy'에 해당하는 데이터만 선택해서 가져올 수 있다.
df.loc[df.country == 'Italy']
2) 산술 연산자와 논리 연산자
산술 연산자 '>, <' 등이나 논리 연산자 '&, |' 등을 조합하여 사용할 수도 있다.
df.loc[(df.country == 'Italy') & (df.points >= 90)]
df.loc[(df.country == 'Italy') | (df.points >= 90)]
3) 그 외
pandas에서 제공하는 빌트인 조건 selector를 사용할 수도 있다.
가장 잘 사용되는 두 가지는 isin과 isnull이다.
isin
df.loc[df.country.isin(['Italy', 'France'])]
값에 Italy나 France가 포함되는 데이터가 반환된다.
isnull
df.loc[df.price.notnull()]
isnull 또는 notnull을 사용해서 NaN의 결측치를 걸러낼 수 있다.
위와 같은 코드를 사용하면, 결측치가 아닌 값으로만 데이터셋을 재구성할 수 있다.
5. 데이터 Assigning
DataFrame에 데이터를 아래와 같이 배정할 수 있다.
df['critic'] = 'everyone'
df['critic']
df['index_backwards'] = range(len(df), 0, -1)
df['index_backwards']
'Study > AI' 카테고리의 다른 글
[데이터 처리](Kaggle Pandas Tutorials) 1. Pandas 이용하여 데이터 생성하고 읽고 쓰기 (0) | 2022.06.09 |
---|---|
[모두의 딥러닝] #5. 딥러닝을 이용한 자연어 처리(NLP) (0) | 2022.02.17 |
[부스트코스 코칭스터디 AI Basic 1기] #1-3. 파이썬 기초 문법Ⅱ (0) | 2022.02.15 |
[부스트코스 코칭스터디 AI Basic 1기] #1-2. 파이썬 기초 문법 (0) | 2022.02.15 |
[모두의 딥러닝] #4. MLP과 CNN로 MNIST 데이터 분류하기 (0) | 2022.02.14 |