인공지능 공부

[2021 NIPA AI 교육 - 기본] 04 데이터 조작 및 분석을 위한 Pandas 심화

koh1018 2021. 8. 9. 23:33
반응형

 

저번 시간에 이어 Pandas에 대해 더 깊게 배워보겠다.

 

먼저 DataFrame을 정렬하는 방법이다.

 

인덱스 값을 기준으로 정렬할 수도 있고, 컬럼 값을 기준으로 정렬할 수도 있다.

먼저 sort_index()라는 함수를 이용해 인덱스 값을 기준으로 정렬할 수 있다.

axis0이면 행 인덱스를 기준으로 정렬된다.

오름차순이 디폴트 값이고 만약 내림차순으로 하고 싶다면 ascending = False 로 인자를 콤마찍고 추가해주면 된다.

 

이렇게 axis1로 하면 열 인덱스를 기준으로 정렬할 수 있다.

여기서는 ascendingFalse이기 때문에 내림차순으로 된다.

 


 

이번에는 컬럼 값을 기준으로 정렬해보겠다.

이때는 사용하는 함수가 다르다.

위와 같이 sort_values()라는 함수를 이용해 정렬한다.

여기에는 아까와 다르게 컬럼 이름을 넣어줘야한다.

그러면 인자로 들어간 이름의 컬럼의 값들이 ascending 값에 맞게 정렬된다.

이것도 마찬가지로 ascendingFalse로 하면 내림차순 정렬이 된다.

 

 

그런데 이렇게 컬럼 기준 정렬을 할 때는 여러 개의 컬럼을 한 번에 정리할 수도 있다.

먼저 정렬할 컬럼을 앞에 적고 그 다음으로 정렬할 컬럼을 적는다.

(여기서 적을 때 대괄호 안에 각각을 넣는다는 거 주의!)

그리고 그 뒤에는 각각의 정렬에 대해 ascending을 어떻게 할 것인지 적는다.

 

중간과정을 보면 col2가 먼저 오름차순으로 정렬이 된다.

 

그리고 결과값을 보면 col1col2결과 값을 방해하지 않는 선에서 정렬된다.

여기서 col20번째 1번째 요소를 보자. 둘 다 A로 동일하다.

근데 col1의 요소는 21로 다르다.

col1은 내림차순으로 정렬하라고 지시했으므로 변하지 않고 그대로 2 1로 있게된다.

 

 


 

 

복잡한 데이터를 처리하기 위해서 함수로 데이터를 연산할 수도 있다.

DataFrame을 분석하는 함수는 여러개가 있다.

그것중엔 집계 함수라고 있는데 집계란 count, max, min, sum 등 숫자를 세고 그 중에 최대 최소를 찾아내는 것을 말한다.

그 중 집계 함수 count 메서드에 대해 먼저 알아보겠다.

axis=0이면 열 기준으로 세서 오른쪽 결과와 같이 korean 열은 3math 열은 NaN 값을 제외하고 2개가 나온다.

그리고 axis=1이면 행기준으로 세 개 된다.

(이때 dtypeint64이다.)

 

 


 

 

이번에는 집계 함수 max, min 메서드이다.

만약 위에서 axis=0 또는 axis=1 로 썼던 것과 달리 괄호 안을 공란으로 두면 디폴트 값인 열 기준으로 (axis=0) 찾는다.

(이때 dtypefloat64이다.)

 

 


 

 

다음으로 집계 함수 sum, mean 메서드이다.

이 메서드들을 이용해서 합계와 평균을 구할 수 있다. 이때도 마찬가지로 디폴트 값은 열 기준이다.

(이때 dtypefloat64이다.)

 

<summean을 사용할 때 추가로 알아둘 것>

위와 같이 skipna 인자를 False로 하면 NaN 값을 그냥 스킵해버리는 것이 아니라 NaN을 반환해버린다.

 

 

이렇게 NaN이 있으면 계산이 번거로워진다. 그래서 그 자리에 숫자를 집어넣는 방법이 있다. 바로 fillna라고 하는 함수를 사용하는 것이다.

1. 먼저 NaN값이 존재하는 컬럼의 평균을 구한다.

2. 그 평균을 fillna()함수의 인자로 넣는다.

 

이렇게 하면 NaN값을 원하는 값으로 대체할 수 있다.

 

그래서 마지막 코드에서 skipna = False 로 했으나 NaN이 없음을 확인할 수 있다.

 

 


 

 

이번에는 DataFrame을 그룹으로 묶는 법을 알아보겠다.

이것은 조건부로 집계를 하고 싶을 때 사용한다.

이 역시 sql에 있는 개념과 같다.

df.groupby(‘key’).sum()df에서 같은 key 값을 갖는 애들끼리 sum 해서 하나의 행으로 만드는 것이다.

예를 들어, 기존 df에서 0번째와 3번째의 key값이 A로 같으므로 둘을 sum해서 3data1의 값이 된다.

그리고 df.groupby([‘key’, ‘data1’]).sum()은 우선 key로 묶은 후, data1으로 상위에 key 그룹을 두고 또 묶는 것이다.

이렇게 계층적으로 groupby를 할 수도 있다.

 

 

 

여기에 이어서 복잡한 집계를 한꺼번에 할 수도 있다.

aggregate함수는 한번의 groupby를 통해서 여러개의 통계함수를 적용시키고 싶을 때 사용한다.

1번 코드는 key컬럼에 대해서 groupby를 할 때 각각의 컬럼(data1data2)에 대해 min, median, max 값을 나타내게 한 것이다. (‘min’ / min 모두 맞는 표기 방식이다. 이해를 돕기 위해 3가지 표기 방식을 모두 사용했다. 다만, median의 경우 NumPy의 속성이므로 np.median이다.)

 

2번 코드는 똑같이 key 컬럼에 대해 groupby를 할 때 data1 컬럼의 경우 min 집계함수를, data2 컬럼의 경우 sum 집계함수를 사용하게 했다.

 

 


 

 

다음으로 필터 연산에 대해 배워보겠다.

groupby를 통해서 그룹의 속성을 기준으로 데이터를 필터링 할 때 쓰는 것이다.

1번 코드는 앞에서 봤던 그냥 단순한 groupby하는 코드이다.

근데 1번 코드에서 더 나아가서 2번 코드에서는 key 컬럼으로 groupbymean값들에 대해서 해당 값들이 3보다 큰 key 컬럼의 행들만 필터링 되어 반환된다.

(주의 : 그니까 이 filter은 반환되는 DataFrame이 앞서 본 것들과 같이 key 컬럼으로 groupby된 것이 반환되는 것이 아니라 key 컬럼의 동일 행들의 연산 결과를 필터링해 나온 결과에 부합되는 값들을 반환하는 것이다.)

 

 


 

 

다음으로는 apply이다.

groupby에도 apply 함수를 적용할 수 있다.

keygroupby로 묶은 상태에서 apply함수안에 lambda 식을 넣어 적용한다.

, groupby로 특정한 컬럼끼리 묶고 그 안에서 apply함수로 계산한 값을 한꺼번에 반환할 수 있다.

 

 


 

 

우리가 groupby로 묶은 데이터에서 원하는 부분의 데이터만을 추출하고 싶을 수 있다.

이때는 key값으로 데이터를 가져올 수 있다.

df.head() 라는 함수로 간단하게 csv 파일의 상단 5개를 볼 수 있다.

데이터 추출 코드에서 보면 시도groupby 된 상태에서 get_group(“충남”) 함수를 이용해 충남에 해당하는 데이터만 가져왔다.

마지막으로, 충남에 있는 학교들이 몇 개나 있는 지 알기 위해서는 len() 함수를 이용해 인자로 get_group() 함수를 이용해 충남그룹의 수를 구하면 된다.

 

 


 

 

다시 볼만한 예제)

1.

위와 같은 상황에서

# keydata1을 기준으로 묶어 합계를 구해 출력해보세요.

라는 문제였다.

 

우선 답은 다음과 같다.

그런데 실행 결과가 중요한데 아래와 같다.

이 의미는 data1groupby가 되는 일종의 분류 기준의 계층 중 하나이기 때문에 sum이 되지 않는다는 것이다.

기존의 df의 값을 유지한 채,

먼저 key 컬럼에 대해 groupby해서 행이 만들어짐 -> 예를들어 keyA인 경우 data11인 경우가 있음 -> 해당 그룹에 포함되는 data2들을 sum.

이런 구조인 것이다.

 

 

2.

반응형