- 과거 내용
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을 사용하기 위해서는 기준이 되는 인덱스 값이 숫자이거나
아스키 코드여야 가능할 듯 하다. 즉 조건보다 작은 것 중에를 사용할 수 있게
행의 값이 비교가 가능해야 한다.
'프로그래밍 > 파이썬' 카테고리의 다른 글
EDA - 1단계 : 데이터 다루기 - 가공 (2) | 2023.07.13 |
---|---|
EDA - 1단계 : 데이터 다루기 - 정렬, 결합 (3) | 2023.07.11 |
EDA - 1단계 : 데이터 다루기 - 함수 적용, 인덱싱 (1) | 2023.07.08 |
EDA - 1단계 : 데이터 다루기 - 객체 내 연산 (1) | 2023.07.07 |
EDA - 1단계 : 데이터 다루기 - 객체 간 연산 (1) | 2023.07.07 |