판다스 2편

주요 내용

SeriesDataFrame 객체를 다루는 다양한 도구를 살펴본다.

기본 설정

pandas 라이브러리는 보통 pd 라는 별칭으로 사용된다.

랜덤 시드, 어레이 내부에 사용되는 부동소수점 정확도, 도표 크기 지정 옵션 등은 이전과 동일하다.

SeriesDataFrame을 표로 보여줄 때 사용되는 행의 수를 20으로 지정한다. 기본 값은 60이다.

5.2 핵심 기능 (p. 198)

5.2.1 리인덱싱 (p. 198)

시리즈 리인덱싱

새로운 인덱스가 추가되면 NaN이 사용된다.

지정되지 않은 인덱스는 무시된다.

결측치 채우기 1: method 키워드 인자

리인덱싱 과정에서 결측치가 발생할 때 여러 방식으로 채울 수 있다. method='fill' 키워드 인자는 결측치를 위쪽에 위치한 값으로 채운다.

주의사항: 인덱스가 오름 또는 내림 차순으로 정렬되어 있는 경우에만 가능하다.

물론 위쪽에 위치한 값이 없으면 결측치가 된다.

아랫쪽에 있는 값으로 채울 수도 있다.

아니면 가장 가까운 곳에 있는 값으로 채울 수도 있다. 1번 인덱스의 경우처럼 거리가 같으면 아랫쪽에서 택한다.

결측치 채우기 2: fill_value 키워드 인자

리인덱싱 과정에서 발생하는 모든 결측치를 지정된 값으로 대체할 수 있다. 기본값은 NaN 이다.

리인덱싱은 항상 새로운 시리즈를 생성한다. 따라서 obj3 자체는 변하지 않는다.

데이터프레임 리인덱싱

데이터프레임은 (행의) index와 (열의) columns 속성에 대해 리인덱싱이 가능하며 작동법은 시리지의 인덱싱과 동일하다.

reindex() 메서드는 기본적으로 행의 index 에 대해 작동한다.

열의 columns에 대해서는 columns 키워드 인자를 활용한다.

reindex() 메서드와 함께 사용할 수 있는 키워드 인자가 더 있지만 여기서는 다루지 않는다.

5.2.2 drop() 메서드 (p. 201)

특정 행 또는 열의 인덱스를 제외한 나머지로 이루어진 시리즈/데이터프레임을 구할 때 사용한다.

시리즈의 경우 인덱스를 한 개 또는 여러 개 지정하면 나머지로 이루어진 시리즈를 얻는다.

원래의 시리즈를 직접 건드리지는 않는다.

하지만 inplace=True 키워드 인자를 이용하여 원본을 수정할 수도 있다. 물론 사용에 매우 주의해야 한다.

데이터프레임의 경우도 기본적으로 행의 인덱스를 기준으로 작동한다.

열을 기준으로 작동하게 하려면 axis=1로 지정한다.

axis='columns'로 지정해도 된다.

inplace=True 키워드 인자를 사용하면 이번에도 원본을 수정함에 주의하라.

5.2.3 인덱싱, 슬라이싱, 필터링(부울 인덱싱) (p. 203)

시리즈의 인덱싱, 슬라이싱, 필터링(부울 인덱싱)

시리즈의 경우 1차원 넘파이 어레이와 거의 동일하게 작동한다. 다만 정수 대신에 지정된 인덱스를 사용할 때 조금 차이가 있다.

여러 개의 인덱스를 리스트로 지정하여 인덱싱을 진행할 수 있다.

필터링(부울 인덱싱)은 동일하게 작동한다.

정수가 아닌 다른 인덱스 이름, 즉 라벨을 이용하는 슬라이싱은 양쪽 구간의 끝을 모두 포함하는 점이 다르다.

주의사항: 라벨 슬라이싱은 기본적으로 알파벳 순서를 따르며 시리즈에 사용된 순서와 상관 없다.

데이터프레임의 인덱싱, 슬라이싱, 필터링(부울 인덱싱)

2차원 넘파이 어레이와 거의 유사하게 작동한다.

인덱싱인 기본적으로 열을 기준으로 진행된다.

하지만 숫자 슬라이싱은 행을 기준으로 작동한다.

필터링(부울 인덱싱) 또한 넘파이 2차원 어레이와 동일하게 작동한다.

필터링을 이용하여 특정 항목의 값을 업데이트할 수도 있다.

각각의 항목에 대한 필터링도 비슷하게 작동한다.

행 단위 인덱싱/슬라이싱 (p. 206)

loc() 또는 iloc() 메서드를 이용한다.

행과 열에 대해 동시에 인덱싱/슬라이싱을 사용할 수 있으며 2차원 넘파이 어레이가 작동하는 방식과 비슷하다.

인덱싱/슬라이싱에 이은 필터링을 연달아 적용할 수도 있다.

5.2.5 산술 연산 (p. 210)

시리즈/데이터프레임의 사칙 연산은 기본적으로 아래 원칙을 따른다.

기본적으로 사용되는 산술 연산 기호에 해당하는 메서드가 존재한다. 아래는 가장 많이 사용되는 연산 메서드들이다.

메서드 설명
add() 덧셈(+) 계산 메서드
sub() 뺄셈(-) 계산 메서드
mul() 곱셈(*) 계산 메서드
div() 나눗셈(/) 계산 메서드
floordiv() 몫 (//) 계산 메서드
pow() 거듭제곱(**) 메서드

연산 과정에서 결측치 채우기

공통 인덱스가 아니거나 결측치가 이미 존재하는 경우 기본적으로 결측치로 처리된다. 하지만 fill_value 키워드 인자를 이용하여 지정된 값으로 처리하게 만들 수도 있다. 다만, 연산 기호 대신에 해당 연산의 메서드를 활용해야 한다.

데이터프레임과 시리즈 사이의 연산

넘파이에서 2차원 어레이와 1차원 어레이 사이에 브로드캐스팅이 가능한 경우, 즉, 차원을 맞출 수 있는 경우에 연산이 가능했다.

브로드캐스팅이 불가능하면 오류가 발생한다.

물론 아래와 같이 브로드캐스팅이 가능하도록 모양을 변환한 다음엔 연산이 가능하다.

데이터프레임과 시리즈 사이의 연산도 동일하게 작동한다. 다만, 행 또는 열에 대한 연산 여부를 확실하게 구분해주어야 한다.

브로드캐스팅은 기본족으로 행 단위로 이루어진다. 따라서 아래처럼 데이터프레임과 시리즈의 연산을 그냥 적용할 수 있다.

공통 인덱스가 존재하면 두 인자 모두에 대해 브로드캐스팅이 적용된다.

열 단위로 데이터프레임과 시리즈를 더하려면 해당 연산 메서드를 axis=0 키워드 인자와 함께 적용해야 한다.

axis='index'를 사용해도 된다.

5.2.6 함수 적용 (p. 217)

유니버설 함수

유니버설 함수는 넘파이의 경우와 동일하게 작동한다.

넘파이의 abs() 함수를 적용하면 항목별로 이루어진다.

시리즈에 대해서도 동일하다.

map()applymap() 메서드

유니버설 함수가 아닌 함수를 시리즈의 항목별로 적용하려면 map() 메서드를 이용한다.

예를 들어 아래 람다(lambda) 함수는 부동소수점을 소수점 이하 셋째 자리에서 반올림한 값만 보여주도록 한다.

시리즈에 적용해보자.

유니버설 함수가 아닌 함수를 데이터프레임의 항목별로 적용하려면 applymap() 메서드를 이용한다.

apply() 메서드

행 또는 열 단위로 함수를 적용하려면 apply() 메서드를 활용한다. 기본은 열 단위로 함수가 적용되며 반환값이 스칼라 값이면 시리즈가 반환된다.

예를 들어 아래 함수는 최댓값과 최소값의 차이를 반환한다.

데이터프레임에 적용하면 열 별로 최댓값과 최솟값의 차이를 계산하여 시리즈로 반환한다.

행 별로 함수를 적용하려면 axis=1 또는 axis='columls'를 지정해야 한다.

함수의 반환값이 시리즈이면 apply() 메서드는 데이터프레임을 반환된다. 예를 들어 아래 함수는 최솟값과 최댓값을 갖는 시리즈를 반환한다.

apply() 메서드와 함께 호출하면 열 별로 최댓값과 최솟값을 계산하여 데이터프레임으로 반환한다.

참고: 시리즈 객체 또한 apply() 메서드를 갖는다. 하지만 기본적으로 map() 메서드처럼 작동한다. map() 메서드보다 좀 더 다야한 기능을 갖지만 여기서는 다루지 않는다.

5.2.7 정렬 (p. 220)

행과 열의 인덱스 또는 항목을 대상으로 정렬할 수 있다.

sort_index() 메서드

시리즈의 경우 인덱스를 기준으로 정렬한다.

내림차순으로 정렬하려면 ascending=False 키워드 인자를 함께 사용한다.

데이터프레임의 경우 행 또는 열의 인덱스를 기준으로 정렬한다.

기본은 행의 인데스를 기준으로 정렬한다.

열의 인덱스를 기준으로 정렬하려면 axis=1 또는 axis='columns' 키워드 인자를 사용한다.

내림차순으로 정렬하려면 ascending=False 키워드 인자를 함께 사용한다.

sort_values() 메서드

지정된 열 또는 행에 속한 값들을 기준으로 정렬할 때 사용한다.

결측치는 맨 나중에 위치시킨다.

데이터프레임의 경우 by 키워드 인자를 이용하여 열의 라벨을 지정해야 한다.

예를 들어 b 열의 값을 기준으로 정렬한다. 물론 동일한 행의 값은 함께 움직인다.

여러 열의 값을 기준으로 정렬하려면 라벨의 리스트를 입력한다. 그러면 리스트 항목 순서대로 기준이 정해진다.

예를 들어 아래 코드는 먼저 a 열의 항목들을 순서대로 정렬한 다음에 동등한 값의 경우에는 b 열의 항목들 순서대로 정렬한다.

참고: axis=1을 이용하여 특정 행의 값을 기준으로 정렬할 수도 있다. 하지만 데이터프레임은 서로 다른 특성을 열 단위로 담는 목적으로 사용되기에 이런 정렬은 사용할 이유가 별로 없다.