본문 바로가기
Pandas 공부해보기

Pandas 3. Series method

by 유티끌 2022. 10. 10.

read_csv()

csv를 읽어올 때 사용합니다.

index_col

Series는 csv를 읽어올때 임의의 숫자 인덱스를 부여하는데, index_col 파라미터를 이용해 임의의 컬럼을 인덱스로 지정할 수 있다.

pokemon = pd.read_csv("pokemon.csv", index_col="Pokemon")

sqeeze()

근데 이렇게 읽어들이면 무조건 Pandas dataframe으로 읽게 된다. 왜냐하면 dataframe은 Serise의 상위개념으로, Series는 하나의 컬럼만을 가질 수 있지만 dataframe은 여러 컬럼을 가질 수 있기 때문에, 처음부터 dataframe으로 데이터를 읽게되면 확장하기도 좋기 때문이다.

따라서 처음부터 Series객체를 생성하려면 sqeeze() 를 이용한다.

pokemon = pd.read_csv("pokemon.csv", index_col="Pokemon").squeeze()

use_col

만일, 여러개의 컬럼을 가진 데이터들을 가져온다고 하면, 컬럼을 제한해주어야 한다. Series는 최대 2개의 컬럼만을 허용하기 때문이다.

battles = pd.read_csv("pokemon.csv", index_col="Start Date", parse_dates=["Start Date"], usecols=["Pokemon", "Type"]).squeeze()

parse_dates

가져오는 컬럼중에는 yyyy-MM-dd 의, 날짜 형태를 가진 문자열이 있을 수 있는데, 이것을 date형식으로 파싱도 가능하다.

google = pd.read_csv("..google_stocks.csv", index_col="Date", parse_dates=["Date"]).squeeze()

지정은 배열형태로 감싸서 하는데, 이유는 가져오는 컬럼에서, date형태로 바꿔야하는 컬럼이 여러개가 될 수 있기 때문이다.

sort_values()

컬럼의 값을 이용해 정렬을 진행한다. 기본적으로는 오름차순으로 정렬된다.

google = pd.read_csv("..google_stocks.csv", index_col="Date", parse_dates=["Date"]).squeeze()
google.sort_values()

문자가 담긴 컬럼이라면 알파벳의 시작부터 끝으로 정렬되는데, 대문자가 있는 경우 대문자 -> 소문자로 정렬 되고, 같은 단어라도 대문자와 소문자는 다른 단어로 다룬다.

ascending

정렬 순서를 내림차순으로 할때는 ascedning 파라미터를 False 로 지정하면 된다.

na_position

na_position 은 값이 결측값(N/A) 이 들어있을때, 정렬을 실행하면 어디에 넣을꺼냐 를 의미하다. 기본적으로는 정렬결과의 제일 마지막에 들어가고, "last" 혹은 "first" 로 명시적 지정이 가능하다. 기본값은 "last" 이다.

battles.sort_values(na_position="first")

drop_na

만일, 결측값을 전부 없애고 싶다면, dropna 메소드를 사용한다.

battles.dropna().sort_values(na_position="first")

sort_index()

값으로만 정렬하는 것이 아니라, 인덱스를 기준으로 정렬도 가능하다.

이 때, 인덱스 컬럼이 날짜형태라면, 기본 정렬로는 오래된 날짜 -> 최근날짜 순으로 정렬한다.

na_position

sort_index 에도 na_position 값이 있는데, 인덱스컬럼에도 NaN 혹은 NaT (Not a Time) 값이 있을 수 있는데, 인덱스컬럼의 결측값 위치를 지정할 때 사용한다.

nsmallest / nlargest

값을 정렬한 후에 상위 몇개, 하위 몇개를 뽑아내는 작업을 지원하는 메소드가 존재한다.

nlargest()

google.sort_values(ascending=False).head()
google.nlargest()

상위 값을 출력한다.
위 2줄은 같은 결과를 리턴한다. 파라미터로 몇개까지를 리턴할 것인지 정할 수 있는데, 기본값은 5 이다.

nsmallest()

google.nsmallest()

상위 값을 출력한다.

inplace

대부분의 메소드는 결과값이 반영된 새로운 Series 객체를 반환한다. 즉 원본값을 변경하지 않는다. 만약 원본을 바꾸고싶다면 메소드에 inplace=True 파라미터를 넘겨서 변경하면 된다. 왠만한 메소드는 inplace 파라미터를 받는다.

단, inplace 를 한 번 사용하더라도, 결국 메소드를 호출할때마다 복사본을 만든다. Pandas in Action에서는, 불변 자료구조가 버그를 줄이는 경향이 있기 때문에 Pandas는 이렇게 구현되었다고 말하고 있다.

value_counts()

값별로 몇개씩 있는지를 카운팅한다. 즉 데이터값을 그룹핑하고, 전체 데이터 내에 해당 그룹값은 몇개씩 있는지 센다.

value_counts 의 전체 길이는 Series 객체가 가진 데이터의 총 갯수와 동일하다.

len(pokemon.value_counts())
pokemon.nuique()

위 2개의 코드는 동일합니다.

ascending

value_counts()ascedning 파라미터를 받는다. 기본값은 False이다.

normalize

normalize 파라미터는, 그룹핑한 전체값에 대해 비율을 확인할 수 있다. 전체 값을 1 이라 했을 때의 각각의 값의 비율을 말한다.
전체 값을 100으로 하기 위해서는 결과값에 * 100 을 해야한다.

pokemon.value_counts(normalize=True) * 100

bins

bins 는 Series 객체가 가진 값들에 대해, 어떠한 정의된 구간값을 제공한다.

이것은 저 해당 구간대에 해당하는 값의 갯수가 몇개인지를 알 수 있게 한다.

여기서 결과값을 보면 괄호와 대괄호가 섞여서 노출되고 있는 것을 알수 있다.

  • 괄호 : 구간에서 제외된 값을 표시
  • 대괄호 : 구간에서 포함된 값을 표시

한다. 즉, (-0.001, 200.0] 이라는 표현은, 0에서 200까지라는 의미이다. Pandas에서는 이것을 open interval, closed interval이라 표현한다.

open interval 은 값이 제외되고, closed interval은 값이 포함된다.

bins 는 파라미터의 값으로, integer형태의 값도 가능하다.

google.value_counts(bins=6).sort_index()

이렇게 한다면 전체 값에서 최댓값과 최솟값을 확인하고, 이것을 토대로 전체 값의 범위를 bins 로 전달받은 값의 갯수로 나눈다.
위 코드처럼 6을 넘긴다면, 전체값을 6등분하여 계산한다.

dropna

value_counts() 는 기본적으로 결측값을 제외하고 계산하는데, dropna=False 를 지정하면 결측값을 포함해서 계산한다.

index

인덱스값에 대해서도 갯수 카운팅을 할 수 있다. 일단 해당 Series 객체의 index 속성값에 대해서, value_counts() 를 실행한다.

google.index.value_counts()

apply()

apply() 메소드를 토대로 모든 Series값에 대해 함수를 적용해볼 수 있다.

그 전에, 파이썬에서의 함수는 일급객체 first-class object 취급을 하는데, 함수도 하나의 객체로 다룰 수 있다는 것이다.

google.apply(round)

apply() 메소드에, 파이썬 내장함수인 round 를 파라미터로 넘기면, Series의 모든 값에 대해 round 처리를 하게 된다. 함수이긴 하지만 객체나 혹은 파라미터처럼 넘길 수 있다는 것이다.

기본 앱 뿐만 아니라, 직접 만든 함수도 가능하다.

예를 들어, 포켓몬의 타입을 보고 타입이 하나만 있는지, 여러개 있는지 판단하고자 한다면 어떻게해야할까?

def single_or_multi(pokemon_type: str):
    if "/" in pokemon_type:
        return "Multi"
    return "Single"

pokemon.apply(single_or_multi).value_counts()

끝!

반응형

댓글