프로그래밍/파이썬

EDA - 1단계 : 데이터 다루기 - 비교, 필터링, 결측치

매 석 2023. 7. 10. 19:04
반응형

- 과거 내용

 

EDA - 1단계 : 데이터 다루기 - 함수 적용, 인덱싱

과거 내용 DataFrame - 함수 적용 1. apply 축 기준이 불가한 경우 개별 적용하여 결과값을 출력한다. 옵...

blog.naver.com

 

- DataFrame - 비교, 필터링

1. 비교

#원본 데이터
      col1  col2  col3
row1    10    20    30
row2    40    50    60
row3    70    80    90

#값 비교(True or False)
print(df.gt(40))

       col1   col2   col3
row1  False  False  False
row2  False   True   True
row3   True   True   True

 

40보다 큰 값은 True, 작거나 같은 값은 False로 나온다.

이외에도 lt, ge, le, eq, ne가 있다. 각각 <, >=, <=, ==, != 을 의미한다.

2. dtype

#원본 데이터
   col1 col2  col3
0    10    a   0.5
1    20    b   1.5
2    30    c   2.5

#타입 확인
print(df.dtypes)

col1      int64
col2     object
col3    float64
dtype: object

#실수만 출력
print(df.select_dtypes(include=[float]))
   col3
0   0.5
1   1.5
2   2.5

 

이렇게 include를 사용해서 특정 타입만 표시하거나, exclude를 사용해

특정 타입만 표시하지 않게 설정할 수 있다.

3. clip

#원본 데이터
   col1  col2  col3
0    10     5     3
1    20     6    -5
2    30     7    -1

#값 범위 제한
print(df.clip(-1,3))

   col1  col2  col3
0     3     3     3
1     3     3    -1
2     3     3    -1

 

clip을 이용하여 -1~+3까지 범위를 제한한 것이다.

그래서 3을 초과하면 3으로, -1보다 작으면 -1로 값을 치환한다.

4. filter

#원본 데이터
   col1  col2  col3
0    10     5     3
1    20     6    -5
2    30     7    -1

#특정 items 선택
print(df.filter(items=['col1','col2']))

   col1  col2
0    10     5
1    20     6
2    30     7

#axis 사용
print(df.filter(items=[0],axis=0))

   col1  col2  col3
0    10     5     3

 

 

이외에도 regex를 사용하여 정규표현식으로 원하는 행과 열을

선택하여 출력할 수 있다.

5. sample

#원본 데이터
      col1  col2  col3
row1    10    20    30
row2     5     6     7
row3     3    -5    -1

#4개를, 중복있이
print(df.sample(4,replace=True))

      col1  col2  col3
row1    10    20    30
row1    10    20    30
row1    10    20    30
row2     5     6     7

#전체의 40%
print(df.sample(frac=0.4))

      col1  col2  col3
row2     5     6     7

#출력한 값 다시 출력
print(df.sample(3,random_state=7))

      col1  col2  col3
row3     3    -5    -1
row2     5     6     7
row1    10    20    30

 

sample은 무작위로 n개를 출력한다. replace를 사용하면 중복여부를 선택할 수 있고,

frac은 전체의 비율만큼 출력할 수 있다. random_state는 출력한 값을

이후에 다시 출력할 수 있게 해준다.

 

 

-DataFrame - 결측치

1. 결측치 확인

#원본 데이터
      col1  col2  col3
row1    10  <NA>   4.0
row2     5   NaN   7.0
row3     3    -5   NaN

#isna
print(df.isna())

       col1   col2   col3
row1  False   True  False
row2  False   True  False
row3  False  False   True

#notna
print(df.notna())

      col1   col2   col3
row1  True  False   True
row2  True  False   True
row3  True   True  False

 

 

​isna의 경우 결측치이면 True를, notna의 경우 결측치가 아니면 True를 반환한다.

 

2. 결측치 제거

 

#원본 데이터
      col1  col2  col3
row1    10  <NA>   4.0
row2     5   NaN   7.0
row3     3    -5     6

#결측치 제거
df.dropna()

      col1 col2  col3
row3     3   -5     6

#특정 레이블만
print(df.dropna(subset=['col1']))

      col1  col2  col3
row1    10  <NA>     4
row2     5   NaN     7
row3     3    -5     6

 

결측치가 포함된 레이블은 모두 제거된다. axis를 통해 행과 열을 정할 수 있다.

또한 이외에도 how, thresh를 사용해서 drop할 수 있다.

3. 결측값 없는 인덱스 확인

#원본 데이터
      col1  col2  col3
row1  <NA>  <NA>  <NA>
row2     5   NaN     7
row3     3    -5     6

#마지막으로 결측치가 아닌 값
print(df.last_valid_index())
row3

 

​first_valid_index는 처음으로 결측치가 아닌 값의 행의 인덱스를 반환한다.

 

4. 결측값 변경

#원본 데이터
      col1  col2  col3
row1  <NA>  <NA>  <NA>
row2     5   NaN     7
row3     3    -5     6

#X로 채우기
print(df.fillna('X'))

     col1 col2 col3
row1    X    X    X
row2    5    X    7
row3    3   -5    6

 

 

옵션으로 method를 사용해 bfill, ffill으로 각각 뒤와 앞에 있는 값을 대체할 수 있다.

또한 옵션으로 downcast를 사용해 문자 형식을 바꿀 수 있다.

5. 결측값 없는 마지막 행 반환

#원본 데이터
    col1  col2  col3
10     5  <NA>     2
30     5   NaN     7
50     3    -5     6

#50이전에 결측값이 모두 없는 행의 값 출력
print(df.asof(where=50))

col1     3
col2    -5
col3     6
Name: 50, dtype: object

#각 조건마다 col3가 결측값이 없는 행의 값 출력
print(df.asof(where=[10,30,50],subset='col3'))

    col1  col2  col3
10     5  <NA>     2
30     5   NaN     7
50     3    -5     6

 

asof를 통해서 결측값이 없는 행의 값을 출력할 수 있다.

where을 사용하기 위해서는 기준이 되는 인덱스 값이 숫자이거나

아스키 코드여야 가능할 듯 하다. 즉 조건보다 작은 것 중에를 사용할 수 있게

행의 값이 비교가 가능해야 한다.