데이터 분석/Python - pandas

[이론] 조건 활용 인덱싱 (필터링)

toraa 2025. 1. 9. 14:43

원하는 관측치 선택하기

수많은 관측치에서 데이터분석할때, id값을 직접적으로 설정하기보다는

관측치가 가지고있는 특징으로 원하는관측치를 찾아오는, 즉 필터링 과정을 거쳐야 함

 

DataFrame에선 bool형식의 데이터 추출 가능

 

1) 데이터 가져오기

import pandas as pd
df_gp=pd.read_csv('data/건강보험심사평가원.csv', 
                  encoding='CP949', 
                  index_col=2, 
                  header=2)

df_gp

 

2) 데이터프레임 내부 데이터 정보 확인하기

: 정보들을 확인해야 조건을 줄 수 있음

 

unique(): 범주형 데이터에 접근

 dataframe이 아닌 series인스턴스에서 쓰는 함수: 특정 컬럼을 인덱싱해서 시리즈로 가져와야 함

min(), max() : 수치형 데이터에서 최소,최댓값 출력

 dataframe(컬럼마다 최소최댓값), series 둘다 함수 존재 

 

unique()함수 활용

df_gp['시도'].unique()  #시리즈로 먼저 가져오기

array(['서울', '부산', '인천', '대구', '광주', '대전', '울산', '경기', '강원', '충북', '충남',
       '전북', '전남', '경북', '경남', '제주', '세종'], dtype=object)

 

nunique() : 항목의 개수

df_gp['시도'].nunique()

17

 

min(), max() 함수 활용

print(df_gp['환자수'].min())
print(df_gp['환자수'].max())

8605
2882159

 

시리즈 비교연산, 데이터프레임[bool] 시퀀스 연산

특정 컬럼을 선택하여 비교연산자 사용해 bool 시리즈 생성

[bool 시리즈] : 데이터프레임의 []연산에 bool시리즈 넣어 인덱싱

 

비교연산으로 bool 시리즈 생성 : 평균보다 큰 환자수 가져오기

true/false로만 이루어진 시리즈가 생성됨

greater = df_gp['환자수'] > 379842  #환자수 시리즈에서 비교연산자 사용
greater

시군구
강남구      True
강동구      True
강서구      True
관악구      True
구로구      True
        ...  
거제시     False
양산시      True
서귀포시    False
제주시      True
세종시      True
Name: 환자수, Length: 250, dtype: bool

 

bool 시리즈로 인덱싱

: false들은 걸러지고 true들만 가져옴

df_gp[greater]

 

여러 조건들 조합

환자수 100만 이상 T/ 시도가 서울인경우 T/ 두 조건이 T인 경우 T

greater = df_gp['환자수'] > 1000000

equal = df_gp['시도'] == '서울'

filters = greater & equal  #논리연산자 사용

df_ft = df_gp[filters]
df_ft

▶ and 같은 명령어가 아닌 & 연산자를 사용해야 함!

 

연산자 활용

~ : not
& : and
| : or

 

다른 방법 예시

df_gp[(df_gp['환자수'] > 1000000) | (df_gp['시도'] == '서울')]

▶ [ ] 연산 안에 우선순위에 따라 () 괄호를 꼭 잘 넣어야 함


함수를 활용한 인덱싱

 

isin() : 여러개의 카테고리를 선택해 가져옴. 

해당 데이터를 T로 표현하는 bool 시리즈 반환

between() : <,>의 &연산을 bool 시리즈로 반환

 

isin() : 여러개의 카테고리를 넣으므로, 기본적으로 리스트인자가 들어감

cond1 = df_gp['시도'].isin(['서울','경기','부산'])
cond1

df_gp[cond1]

 

between()

df_gp['환자수'].between(300000, 1000000)

 

inclusive : 경계값 포함 여부 (이상/초과)

- 'both', 'left', 'right', 'neither'

df_gp[df_gp['환자수'].between(300000, 1000000, inclusive='left')]

sample() 활용한 랜덤 표본 인덱싱

frac : 백분율로 표본 추출 

n : 개수 지정하여 표본 추출

 

frac에 특정 실수값 입력 (0~1사이 값: 확률 의미)

df_gp.sample(frac=0.1)

 

 

n에 개수를 지정

df_gp.sample(n=100)

원하는 컬럼(변수) 선택

select_dtypes : 데이터 타입을 통해 원하는 컬럼 선택

filter : 컬럼 이름 패턴을 통해 선택

 

 

수치형 데이터 컬럼만 선택 - number

df_gp.select_dtypes(include='number')

 

문자열 데이터 컬럼만 선택 - object

df_gp.select_dtypes(include='object')

 

filter() 함수 사용 : 실제로 거의 사용하지는 않음

- regex : 정규표현식(regular expression)
- 'e$' : 'e'로 끝나는 이름/텍스트
- '^s' : 's'로 시작하는 이름/텍스트

 

 '수'로 끝나는 컬럼들

df_gp.filter(regex='수$').columns

Index(['환자수', '명세서청구건수', '입내원일수'], dtype='object')