AI/머신러닝

[ML 실습] 5일차 복습- 판다스 DataFrame(2)

씨이오가 되자 2025. 1. 28. 14:58
728x90

데이터 셀렉션 및 필터링

DataFrame titanic_df

 

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

생성된 DataFrame

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

승객 중 60살 이상인 데이터를 추출한 결과

titanic_df[titanic_df['Age']>60][['Name','Age']].head(3)

나이가 60살보다 위에 있는 'Name', 'Age'컬럼의 데이터를 추출

이번엔 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')]

나이가 60 위이고, 'Pclass' 값이 1이고, 성별이 여성인 데이터를 추출

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

개별 조건을 변수에 할당하고 할당한 변수들을 결합해서 불린 인덱싱 수행

똑같은 결과.

 


참고)

파이썬 머신러닝 완벽 가이드, 권철민, 위키북스 

728x90