본문 바로가기

Study/AI

[데이터 처리](Kaggle Pandas Tutorials) 2. Indexing, Selecting, Assigning

반응형

본 포스트의 내용은 아래의 Kaggle Pandas Tutorials Course의 각 step에 대해 공부한 것을 바탕으로 합니다.

https://www.kaggle.com/code/residentmario/indexing-selecting-assigning

 

Indexing, Selecting & Assigning

Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources

www.kaggle.com

 

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']

 

반응형