DataFrame의 [ ] 연산자 

 

넘파이와 DataFrame 간 가장 유의해야 할 연산자가 바로 '[  ]' 연산자이다. 


넘파이 - 행의 위치, 열의 위치, 슬라이싱 범위 등을 지정하여 데이터를 가져올 수 있었다. 

DataFrame - 칼럼만 지정할 수 있는 칼럼 지정 연산자로 이해를 하는 것이 가장 좋다. 
(추가적으로, 인덱스로 변환 가능한 표현식도 들어갈 수 있다. ) 

 

 

 

print('단일 칼럼 데이터 추출 : \n', titanic_df['Pclass'].head(3))
print('\n여러 칼럼의 데이터 추출: \n', titanic_df[['Survived', 'Pclass']].head(3))
print('[] 안에 숫자 index는 KeyError 오류 발생 : \n', titanic_df[0])

 

 

 

인덱스 형태로 변환 가능한 표현식은 [ ] 내에 입력할 수 있다. 일반적으로 알고있는 슬라이싱 표현기법과 데이터 추출을 하는 시에 가장 많이 사용하는 불린 인덱싱도 가능하다. 

 

titanic_df[0:2]

 

titanic_df[titanic_df['Pclass'] == 3].head(3)

 

 

 

 

 

 

iloc[ ] / loc[ ] 

 

 

둘의 차이점을 얘기하기 전에 먼저 명칭(Label) 기반 인덱싱과 위치(Position)기반 인덱싱에 대한 차이점부터 얘기해보자. 

명칭(Label) 기반 인덱싱이란, '칼럼'의 명칭을 기반으로 위치를 지정하는 방식이다.
위치(Position) 기반 인덱싱이란, 0을 출발점으로 하는 가로축, 세로축 좌표 기반의 행과 열 위치를 기반으로 위치를 지정하는 방식이다. 

명칭 기반 인덱싱 연산자는 loc[ ] 
위치 기반 인덱싱 연산자는 iloc[ ]이다. 

 

 

iloc[ ]

 

iloc[ ]는 위치 기반 인덱싱만 허용한다. 따라서, 대괄호([  ]) 안에 들어가는 요소는 모두 integer, integer형의 슬라이싱, 팬시 리스트 값을 입력해야 한다. 대괄호 안에 위치 인덱싱이 아닌 명칭을 입력하면 오류가 발생한다. 

iloc[ ]는 슬라이싱과 팬시 인덱싱은 제공하나 불린 인덱싱은 제공하지 않는다. 

 

 

#다음 코드는 오류를 발생합니다. 
titanic_df.iloc[0, 'Name']

 

 

 

titanic_df_reset = titanic_df.reset_index()
titanic_df_reset.head(3)

titanic_df_reset.iloc[0, 1]

 

 

 

 

 

loc[ ] 

 

loc[ ]은 명칭 기반으로 데이터를 추출한다. 

하지만 무조건 대괄호 안에 문자열을 입력을 해야하는 것은 아니다. Index가 숫자형으로 되어있는 경우에는 숫자형 데이터를 인자로 입력해야한다. 하지만 명확하게 구분해야 할 것은 입력하는 숫자가 인덱스를 '지칭'하는 것이라는 것이다. 이것은 슬라이싱 관련 개념에서 알아볼 수 있다. 

loc[ ] 도 슬라이싱 기호':'를 적용하는 것이 가능하다.

하지만, 일반적으로 [시작 값: 종료 값]을 하면, 시작 값 ~ 종료 값 -1까지의 범위를 의미한다. 하지만, 인덱스가 숫자 자료형으로 되어있는 경우에도 프로그램에서는 명칭 기반으로 해석하기 때문에,  인덱스에서 3이 지칭하는 것 이전의 인덱스가 2라는 것을 추정할 수 없다. 이런 이유로 인해서 [시작 값: 종료 값]을 하면, 시작 값 ~ 종료 값까지를 의미하게 된다. 

 

 

data = {'Name' : ['Chulmin', 'Eunkyung', 'Jinwoong', 'Soobeom'],
       'Year' : [2011, 2016, 2015, 2015],
       'Gender' : ['Male', 'Female', 'Male', 'Male']
       }

data_df = pd.DataFrame(data , index=['one', 'two', 'three', 'four'])
data_df



# data_df를 reset_index()로 새로운 숫자형 인덱스를 생성 
data_df_reset = data_df.reset_index()
data_df_reset = data_df_reset.rename(columns = {'index' : 'old_index'})


#인덱스 값에 1을 더해서 1부터 시작하는 새로운 인덱스값 생성 
data_df_reset.index = data_df_reset.index + 1
data_df_reset

 

 

data_df.loc['one', 'Name']

 

 

 

 

 

print(data_df_reset.loc[1:2, 'Name'])

 

 

이렇게 [1:2]를 했음에도 1에 해당하는 데이터만 출력되는 것이 아니라 1과 2에 해당하는 데이터 전부가 출력되는 것을 확인 할 수 있다. 

 

 

 

불린 인덱싱

 

불린 인덱싱은 매우 편리하고, 아주 많이 사용되는 기법이다. 이것은 대괄호 연산자 안에 조건식을 입력해주면  굳이 인덱스를 지칭하여 입력하지 않아도 조건식에 해당하는 데이터들만 추출할 수 있다. 또한 loc[ ]연산자에서도 불린 인덱싱을 적용할 수 있으며, 다른 기능들과 결합하여 사용될 수 있다. 

 

 

titanic_boolean = titanic_df[titanic_df['Age'] > 60]
print(type(titanic_boolean))
titanic_boolean

 

 

이렇게 굳이 33, 54 등의 인덱스를 직접 입력하지 않아도 'Age'가 60보다 큰 데이터들을 모두 추출하는 것을 볼 수 있다. 

 

또한, 여러개의 복합 조건을 이용하는 것도 가능하다. 

 

titanic_df[(titanic_df['Age']> 60) & (titanic_df['Pclass'] == 1) & (titanic_df['Sex']=='female')]

 

 

and 조건일 때에는 & , or 조건일 때에는 | (shift + \) , Not 조건일 때에는 ~ 기호를 사용한다. 

 

위와 같이 복합조건을 사용하는 경우에는 코드의 길이가 길어지는 경우가 발생하기도 한다. 

이런 경우에 각 조건들을 변수에 할당하고 변수 이름들을 활용하여 불린 인덱싱을 수행할 수도 있다. 

 

cond1 = titanic_df['Age']> 60
cond2 = titanic_df['Pclass'] == 1
cond3 = titanic_df['Sex']=='female'
titanic_df[cond1&cond2&cond3]

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기