[ML 실습] 5일차 복습- 판다스 DataFrame(2)
데이터 셀렉션 및 필터링
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])
DataFrame에 ['칼럼명']으로 '칼럼명'에 해당하는 칼럼 데이터의 일부만 추출해봤다. 여러 개의 칼럼에서 데이터를 추출하려면 ['칼럼1','칼럼2']와 같이 리스트 객체를 이용하였다. 하지만 titanic_df[0] 같은 표현식은 오류 발생했다. 왜냐하면, DataFrame 뒤의 [ ]에는 칼럼명을 지정해야하는데, 0이 칼럼명이 아니기 때문이다.
판다스의 인덱스 형태로 변환가능한 표현식은 [ ] 내에 입력가능하다. 가령 titanic_df의 처음 2개 데이터를 추출하고자 titanic_df[0:2]와 같은 슬라이싱을 이용하면 정확히 원하는 결과를 반환한다.
또한 불린 인덱싱 표현이 가능하다.
[ ] 내의 불린 인덱싱 기능은 원하는 데이터를 편리하게 추출해주므로 매우 자주 사용된다.
titanic_df[titanic_df['Pclass']==3].head(3)
Best Guideline
- DataFrame 바로 뒤의 [ ] 연산자는 넘파이의 [ ]나 Series의 [ ]와 다르다.
- DataFrame 바로 뒤의 [ ] 내 입력값은 칼럼명을 지정해 칼럼 지정 연산에 사용하거나 불린 인덱스 용도로만 사용해야한다.
- DataFrame[0:2]와 같은 슬라이싱 연산으로 데이터를 추출하는 방법은 사용하지 말 것!
판다스는 DataFrame의 로우나 칼럼을 지정하여 데이터를 선택할 수 있는 인덱싱 방식으로 iloc[ ](위치기반 인덱싱)과 loc[ ](명칭 기반 인덱싱)을 제공한다.
DataFrame iloc[ ] 연산자
행과 열 위치를, 0을 출발점으로 하는 세로 축, 가로 축 좌표 정숫값으로 지정하는 방식이다.
정숫값 또는 정수형의 슬라이싱, 팬시 리스트 값만 취급한다.
iloc [행 위치 정숫값, 열 위치 정숫값]으로 사용한다.
data = {'Name':['Chulmin','Eunkung','Jinwoong','Soobeom'],
'Year':[2011, 2016, 2015, 2015],
'Gender':['Male','Female','Male','Female']
}
data_df = pd.DataFrame(data,index=['one','two','three','four'])
data_df
data_df의 첫번째 행, 첫번째 열의 데이터를 iloc[ ]를 이용해 추출하는 코드는 다음과 같다.
data_df.iloc[0,0]
DataFrame의 인덱스 값이나 칼럼명을 입력하면 오류를 발생시킨다.
실습 ⏬
data_df.iloc[1,0]
data_df.iloc[2,1]
data_df.iloc[0:2,[0,1]]
data_df.iloc[0:2,0:3]
data_df.iloc[:]
data_df.iloc[:,:]
print("\n 맨 마지막 칼럼 데이터 [:,-1]\n",data_df.iloc[:,-1])
print("\n 맨 마지막 칼럼을 제외한 모든 데이터 [:,:-1]\n",data_df.iloc[:,:-1])
-1은 뭐냐면 DataFrame의 가장 마지막 열 데이터를 가져올때 사용한다.
iloc[ ]는 슬라이싱과 팬시 인덱싱은 제공하지만, 명확한 위치 기반 인덱싱이 사용되어야 하는 제약이 있어서 불린 인덱싱은 제공하지 않는다.
DataFrame loc[ ] 연산자
데이터 프레임의 인덱스 값으로 행 위치를, 칼럼의 명칭으로 열 위치를 지정하는 방식이다.
data_df.loc['one','Name']
정숫값 사용x
data_df.loc[0,'Name']
loc[ ]에 슬라이싱을 사용할 때 주의해야할 점!
일반적인 슬라이싱은 시작값:종료값 이라면 시작값에서부터 종료값-1까지인데,
loc[ ]에서는 종료값-1이 아니라 종료값이다.
print('위치기반 iloc slicing\n',data_df.iloc[0:1,0],'\n')
print('명칭기반 loc slicing\n',data_df.loc['one':'two','Name'])
실습 ⏬
data_df.loc['three','Name']
data_df.loc['one':'two',['Name','Year']]
data_df.loc['one':'three','Name':'Gender']
data_df.loc[:]
data_df.loc[data_df.Year>=2014]
Summary
개별 또는 여러 칼럼 값 전체를 추출하고자 한다면 굳이 iloc[ ], loc[ ]을 사용안해도 된다.
행과 열을 함께 사용하여 데이터를 추출할때 사용할 것!
DataFrame의 인덱스나 칼럼명으로 데이터에 접근 ▶️ 명칭 기반 인덱싱
0부터 시작하는 행, 열의 위치 좌표으로 접근 ▶️ 위치 기반 인덱싱
불린 인덱싱
[ ] 연산자 내에 불린 조건을 입력하면 불린 인덱싱으로 자동으로 결과를 찾아준다.
titanic_boolean = titanic_df[titanic_df['Age']>60]
print(type(titanic_boolean))
titanic_boolean
titanic_df[titanic_df['Age']>60][['Name','Age']].head(3)
이번엔 loc[ ] 사용
titanic_df.loc[titanic_df['Age']>60,['Name','Age']].head(3)
and 조건일 때 & 사용, or 조건일 때 | 사용, Not 조건일 때 ~ 사용
titanic_df[(titanic_df['Age']>60)&(titanic_df['Pclass']==1)&(titanic_df['Sex']=='female')]
cond1 = titanic_df['Age']>60
cond2 = titanic_df['Pclass']==1
cond3 = titanic_df['Sex']=='female'
titanic_df[cond1 & cond2 & cond3]
개별 조건을 변수에 할당하고 할당한 변수들을 결합해서 불린 인덱싱 수행
참고)
파이썬 머신러닝 완벽 가이드, 권철민, 위키북스