[Capstone Study] 머신러닝 완벽 가이드

[머신러닝] 섹션 1.4 데이터 핸들링 - 판다스 (4)

wlalsu_u 2023. 11. 6. 02:03

https://wlalsu.tistory.com/122

 

[머신러닝] 섹션 1.4 데이터 핸들링 - 판다스(3)

https://wlalsu.tistory.com/121 [머신러닝] 섹션 1.4 데이터 핸들링 - 판다스(2) https://wlalsu.tistory.com/120 [머신러닝] 섹션 1.4 데이터 핸들링 - 판다스(1) 1.4.1 판다스(Pandas) 란? 판다스는 기존의 불편한 분석용

wlalsu.tistory.com

 

 

 

 

 

 

 

1.4.8 정렬, Aggregation 함수, GroupBy 적용

 

 

 

 

 

DataFrame, Series의 정렬 - sort_values()

 

 

 

 

 

- 매우 편리한 데이터 필터링 방식

 

- RDBMS SQL의 order by 와 유사

 

 

 

 

 

[ 추가 ] sort_values() 의 주요 파라미터 기능

- by : 특정 칼럼으로 정렬을 수행

- ascendind : True(기본 값)로 설정 시 오름차순, False로 설정 시 내림차순

- inplace : False(기본 값)로 설정 시 호출한 DataFrame은 유지하고 정렬된 DataFrame 반환, True 시 호출한             DataFrame 의 정렬 결과 그대로 적용

 

 

 

 

 

 

 

앞선 타이타닉 예제를 'Name' 칼럼을 기준으로 오름차순으로 정렬해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

여러개의 칼럼으로 정렬하는 경우

 

아래와 같이 리스트를 by 에 입력하면 된다.

 

 

 

 

Pclass와 Name을 내림차순으로 정렬해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Aggregation 함수 적용

 

 

 

 

- min() / max() / sum() / count()

 

- DataFrame에서 바로 호출할 경우 모든 칼럼에 적용됨

 

- 특정 칼럼에만 적용하고 싶은 경우 대상 칼럼을 추출하여 적용

 

- RDBMS SQL 의 aggregation 함수 적용과 유사

 

 

 

 

 

 

 

타이타닉 DataFrame에 count() 함수를 적용하여

 

모든 칼럼의 count() 값을 반환해보자.

 

이때 count는 Null 값을 반영하지 않은 결과를 반영한다.

 

 

 

 

 

 

 

 

 

 

 

 

만약 Age 와 Fare 칼럼에만 적용하고 싶은 경우

 

아래와 같이 대상 칼럼만 추출하여 적용하면 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

groupby() 적용

 

 

 

 

- by 파라미터에 입력한 칼럼으로 group by 됨

 

- DataFrame에 groupby() 한 경우, DataFrameGroupBy 라는 또 다른 DataFrame 반환

 

- DataFrame에 groupby() 를 호출한 반환값에 aggregation 함수 적용 시 groupby() 대상 칼럼은 제외됨

 

- RDBMS SQL 의 group by 키워드와 유사

 

 

 

 

 

 

 

 

앞선 예제에서 Pclass 칼럼을 기준으로 GroupBy를 해보자.

 

 

 

 

 

 

 

 

 

 

 

 

Pclass 칼럼을 기준으로 한 DataFrameGroupBy 객체가 반환된 것을 확인할 수 있다.

 

 

 

 

 

 

앞서 DataFrame에 groupby() 를 호출한 반환값에 aggregation 함수를 적용하면

 

groupby() 대상 칼럼을 제외한 칼럼에 aggregation 함수가 적용된다고 하였다.

 

 

 

 

따라서 필터링하고 싶은 칼럼이 있는 경우,

 

groupby()로 반환된 DataFrameGroupBy 객체에

 

해당 칼럼을 먼저 필터링하여야 한다.

 

 

 

 

 

Pclass로 groupby() 한 후,

 

PassengerId 와 Survived 칼럼으로 필터링하여

 

이 두 칼럼에만 count() 연산이 수행되도록 해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

또한 여러 개의 aggregation 함수명을 적용하고 싶은 경우

 

DataFrameGroupBy 객체의 agg ( ) 내에 인자로 입력하면 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이러한 방식은 다양한 칼럼에 다양한 aggregation 함수를 적용하고 싶은 경우

 

매우 비효율적일 수밖에 없다.

 

 

 

 

 

따라서 이러한 경우 agg( ) 내에 입력 값을 딕셔너리 형태로 적용하여

 

보다 효율적으로 구현할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

1.4.9 결손 데이터 처리하기

 

 

 

 

 

칼럼 값이 Null인 경우, 이를 결손 데이터라고 이야기 한다.

 

넘파이에서는 이를 NaN 으로 표시하는데,

 

기본적인 머신러닝 알고리즘은 NaN 값을 처리하지 않으므로, 대체 값이 필요하다.

 

 

 

 

또한 NaN 값은 평균, 총합 등의 연산을 수행하지 않으므로,

 

데이처 연산시 문제를 야기할 수 있다.

 

판다스는 이러한 결손 데이터 처리를 위한 편리한 API를 제공한다.

 

 

 

 

 

 

 

 

isna( ) - 결손 데이터 여부 확인

 

 

 

 

- 데이터가 NaN인지 아닌지 확인

 

- DataFrame에 수행하는 경우 모든 칼럽의 값에 대해 True / False 값을 반환

 

- sum() 함수를 이용하여 결손 데이터의 개수 확인 가능

 

 

 

 

 

 

 

 

 

 

또한 isna() 결과 값에 sum() 함수를 이용하여

 

결손 데이터의 개수를 파악할 수 있다.

 

 

True값은 숫자 1로, False 값은 숫자 0으로 반환된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fillna( ) - NaN 값을 다른 값으로 대체

 

 

 

 

- 결손 데이터를 다른 값으로 대체

 

- 반환 값을 다시 받거나, inplace = True로 설정한 경우만 실제 데이터 세트가 변경됨

 

 

 

 

 

 

 

 

타이타닉 예제의 Cabin 칼럼의 Nan 값을

 

모두 C000으로 대체해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

위의 예제의 경우 titanic_df['Cabin'].fillna('C000') 값을

 

다시 titanic_df['Cabin'] 에서 받는 것을 확인할 수 있다.

 

 

 

 

이렇게 반환값을 다시 받지 않으면 실제 데이터 세트 값은 변경되지 않게 된다.

 

(혹은 inplace = True 값으로 설정해주어도 된다)

 

 

 

 

 

 

Age 칼럼의 Nan 값은 평균 나이로 변경하고,

 

Embarked 칼럼의 Nan 값은 S로 대체하여

 

아래와 같이 모든 결손 데이터를 처리할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

1.4.10 apply lambda 식으로 데이터 가공

 

 

 

 

 

판다스는 DataFrame 이나 Series의 복잡한 가공이 필요한 경우

 

apply 함수에 lambda 식을 결합할 수 있다.

 

 

 

 

 

 

 

람다(lambda) 식

 

 

 

 

- 함수형 프로그래밍을 지원하기 위해 사용

 

- 함수의 선언과 함수 내의 처리를 한 줄의 식으로 표현

 

- ( : ) 를 기준으로 왼쪽은 입력 인자, 오른쪽은 입력 인자의 계산식을 표현

 

 

 

 

 

 

 

 

 

 

 

여러 개의 입력 인자가 필요한 경우

 

아래와 같이 map() 함수를 이용할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

DataFrame의 apply에 lambda식 적용하기

 

 

 

 

 

- 함수형 프로그래밍을 지원하기 위해 사용

 

- 함수의 선언과 함수 내의 처리를 한 줄의 식으로 표현

 

 

 

 

 

 

먼저 Name 칼럼의 문자열의 개수를

 

Name_len 이라는 새로운 칼럼에 저장해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

다음으로 if / else 문을 이용하여

 

나이가 15세 미만이면 Child, 이상이면 Adult로 구분하는

 

Child_Adult 칼럼을 생성해보자.

 

 

 

 

이때 반환 값을 if 식의 앞에 먼저 작성해야 함을 유의하자!

 

 

 

 

 

 

 

 

 

 

 

 

 

다음으로 15세 이하는 Child,

 

15~60세 이하는 Adult, 

 

61세 이상은 Elderly로 구분하는 Age_Cat 칼럼을 생성해보자.

 

 

 

이때 lambda 식은 if / else는 지원하지만

 

else if 는 지원하지 않는다는 점을 유의하자.

 

 

 

 

 

 

 

 

 

 

 

 

만약 if / else 문이 많이 필요한 경우

 

아래와 같이 별도의 함수를 작성하여 적용할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

권철민 '파이썬 머신러닝 완벽 가이드 (개정2판)' 책을 기반으로 작성하였습니다.