본문 바로가기

Programming/Data mining

5. pandas 기초(Querying a DataFrame, Indexing)

Coursera.org 에서 Michigan University의 Applied Data Science with Python의 강의를 토대로 정리한 내용입니다.

이번시간에는 저번 자료에 이어서 DataFrame을 Querying하는 방법에 대해서 한번 알아보도록 할게요.
기본적인 Series나 Dataframe과 같은 타입에 대해서 알고 싶으신 분들은 아래의 이전 게시글을 참고해주세요.
2020/02/04 - [Programming] - 4. pandas 기초(series, dataframe) _ 파이썬을 활용한 데이터마이닝

Querying한다는 것은 저번에 말했듯이 어떤 데이터에 어떻게 요청해서 원하는 정보를 얻을 수 있을까라고 생각하시면 됩니다.
바로 예시로 들어갈게요.

df['Gold'] > 0 #이 코드는 Boolean type의 Series를 리턴합니다. 
>>>
Afghanistan (AFG)                               False
Algeria (ALG)                                    True
Argentina (ARG)                                  True
Armenia (ARM)                                    True
Australasia (ANZ) [ANZ]                          True
#이러한 형식이 되고 Gold column의 데이터가 0보다 크면 True 작으면 False를 리턴하게 됩니다.

#이러한 boolean type이 중요한 이유는 바로 Boolean Masking을 하기 위해서 인데요.
#한마디로 특정한 조건을 만족하는 데이터들을 따로 선별해내는 작업을 위해서입니다. 이런식으로요.
only_gold = df.where(df['Gold'] > 0) #이 코드는 Gold column의 데이터가 0보다 큰 값들만 수집합니다.

이렇게 되면, 0보다 작은 값들의 행들은 NAN으로 저장되게 됩니다.
only_gold['Gold'].count() >>> 100
df['Gold'].count() >>> 147 
#이런식으로 실제로 47개의 행이 NAN으로 저장되었다는 것을 알 수 있어요.(.count()는 NAN은 카운트하지않아요.)

only_gold = only_gold.dropna() #.dorpna() 함수를 통해서 NAN으로 저장된 행을 탈락시킬수도 있어요.

only_gold = df[df['Gold'] > 0] 
#이런식으로 .where함수를 쓰지 않고 바로 boolean masking을 할 수도 있어요.
#단, 이때는 NAN형태로 저장되지 않으므로 굳이 .dropna() 함수를 사용하지 않아도 좋아요.

df[(df['Gold.1'] > 0) & (df['Gold'] == 0)]
#이런 식으로 다양한 조건들을 넣을 수도 있답니다.

 Indexing에 대해서도 간단히 알아보도록 할게요.
우선 pandas에서는 series에서도 dataframe에서도 항상 index를 설정하거나 설정하지 않아도 자동으로 0부터 순서대로 할당되는데요.
그렇게 index를 설정하고 변경 및 indexing은 어떻게 할 수 있을까요?

df['country'] = df.index
#요런 코드를 통해서, column의 index가 'country'인 column을 dataframe의 index 열로 사용할 수 있어요.

df = df.reset_index()
#이렇게 하면 다시 index를 0부터 숫자로 초기화해준답니다.

df['SUMLEV'].unique()
#unique()라는 함수는 어떤 column에서 반복되는 값들이 있을 때, 
#그 값들 중 하나씩만 추출하여 column에 들어있는 data들을 list로 저장해주는 함수입니다.

columns_to_keep = ['STNAME',
                   'CTYNAME',
                   'POPESTIMATE2010',
                   'POPESTIMATE2011',
                   'POPESTIMATE2012',
                   'POPESTIMATE2013',
                   'POPESTIMATE2014',
                   'POPESTIMATE2015']
df = df[columns_to_keep]
#위의 설정을 통해서 필요없는 column들을 날려버릴 수도 있어요.
#이때 중요한 것은 지키고자 하는 column들을 list의 형태로 df[]안에 넣어줘야 한다는 거죠.

df = df.set_index(['STNAME', 'CTYNAME'])
#index 설정은 set_index() 함수를 통해서 할 수 있어요.
#위처럼 리스트로 두개의 변수를 할당하면 column 두개가 index로 설정됩니다.
#리스트 앞에 위치한 것이 상위 index로 설정됩니다. 이런 경우는 아래와 같이 indexing 할 수 있어요.

df.loc[ [('Michigan', 'Washtenaw County'),
         ('Michigan', 'Wayne County')] ]

df = df.sort_index()
#sort_index()함수를 활용하여 index를 기준으로 오름차순으로 정렬할 수 있어요. 

df = df.fillna(method='ffill')
#fillna() 함수를 활용하여 채울 수 있어요.
#method = 'ffill'은 결측값을 바로 이전 값으로 채운다는 뜻이고 'bfill'은 뒤의 값으로 채운다는 뜻입니다.
#그리고 ()안에 다른 문자를 넣어 ex)'missing'이나 'NONE' 등으로 채워넣을 수도 있어요.

'Programming > Data mining' 카테고리의 다른 글

7. Pandas 심화 (groupby)  (0) 2020.02.04
6. Pandas 심화 (Merge(), Pandorable code)  (0) 2020.02.04
4. pandas 기초(series, dataframe)  (0) 2020.02.04
3. Numpy 기초  (0) 2020.02.03
2. Objects and map()  (0) 2020.02.03