본문 바로가기
기본적인프로그래밍/python

[python, pandas] Data scientist라면 알아야 할 기본 기능

by 인포메틱스 2023. 2. 15.
반응형

1. Introduction

 Pandas module은 data scientist들이 가장 많이 사용하고 있는 모듈중 하나일 것입니다. 혹은 R 프로그래밍을 하셨던 분이라면, 유사하게 데이터를 다룰수 있도록 하는 모듈이 이 pandas일 것입니다.

 

 주로 pandas는 pd로 줄여서 분석을 합니다.

 

이번 포스팅은 pandas에서 기본중에 기본기능에 대해서 이야기해보려고 합니다.

 

2. 기능들

 실습에 사용되는 데이터는 다음에서 다운받으시면 됩니다.

https://archive.ics.uci.edu/ml/datasets/iris

 

UCI Machine Learning Repository: Iris Data Set

Data Set Characteristics:   Multivariate Number of Instances: 150 Area: Life Attribute Characteristics: Real Number of Attributes: 4 Date Donated 1988-07-01 Associated Tasks: Classification Missing Values? No Number of Web Hits: 5162731 Source: Creator:

archive.ics.uci.edu

 

2-1. pd.read_csv()

 csv라고 함은 Comma separated Values 라는 뜻의 약자로서 comma(,)로 column이 나누어져 있는 데이터를 이야기합니다.

 

 R에서는 read.csv, read.table을 이용하여 데이터를 읽어올 수 있고, 마찬가지로 python pandas에서 pd.read_csv를 이용하여 데이터를 읽어 올 수 있습니다.

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',')

 R에서와 마찬가지로 pd.read_csv()에는 많은 option들이 있습니다.

 

 자주 사용하는 옵션들은 다음과 같습니다. sep, header, index_col, skiprows, na_values

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',',header=None,index_col= 4)

data1 확인한 결과

 

 

 sep에는 다양한 문자들을 넣어서 column을 나눌수가 있고(대표적으로 tsv 파일 (sep = '\t')), header, index_col의 경우 column name, row name 의 위치를 지정할 수가 있습니다(지정하기 싫을때는 None).

skiprows원하는 줄만큼 skip하고 다음부터 읽도록 할수가 있습니다. 가끔 header위에 데이터에 대한 정보가 포함되는 파일이 있습니다. 이럴때 사용하면 됩니다. na_values는 NA처리를 어떻게 할거냐?이고, String을 추가해주면 됩니다.

 

2-2. df.describe()

# df는 data frame의 약자로 pd.read_csv를 df로 읽었다고 가정하고 진행하겠습니다.

 

 이 기능은 데이터의 Column기준으로 기본적인 통계를 표시해 줍니다. 기본적인 통계라 함은 데이터의 개수, 평균, 표준편차, 최소값, 최댓값, 25%,50%,75% 에 있는 값 등을 표시해줍니다.

 그리고 문자에 대해서도 정리를 해줍니다. 문자의 경우 빈도수나, Unique한 데이터 개수 등을 알려줍니다.

 

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',',header=None,index_col= None)
data1.describe(include='all')
data1.describe(exclude='number')
data1.describe(exclude='object')

순서대로 include = 'all', exclude='number', exclude = 'object'

2-3 df.info()

 데이터의 간단한 정보들을 알 수가 있습니다. 각 column별로 data type 종류와 메모리가 얼마나 차지하는지 확인이 가능합니다.

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',',header=None,index_col= None)
data1.info()

df.info의 결과

 

2-4 df.plot()

이 기능은 데이터 내에서 만들고 싶은 다양한 그래프들을 그릴 수가 있습니다. kind를 이용하여 그래프를 다양하게 제작할수가 있는데, 만들수 있는 그래프는 line, bar, barh, hist, box, kde, density, area, pie, scatter, hexbin 이 가능합니다.

 

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',',header=None,index_col= None)

data1.plot(kind='line',x=0,y=2)
data1[0].value_counts().plot(kind='bar')
data1[0].value_counts().plot(kind='barh')
data1[0].plot(kind='hist')
data1[0].plot(kind='box')
data1[0].plot(kind='kde')
data1[0].plot(kind='density')
data1[0].plot(kind='area')
data1[0].value_counts().plot(kind='pie')
data1.plot(kind='scatter',x=0,y=1)
data1.plot(kind='hexbin',x=0,y=1)

 

순서대로  line,bar,barh,box, kde(density와 동일하게 나와 생략), area, pie, scatter, hexbin

 

  각 plot에서 title, xlabel, ylabel, legend, grid, xlim, ylim, xticks, yticks 등을 이용하여 변경할 수가 있습니다. 

  plot의 기능은 matplotlib에서 가져온 기능이기 때문에 matplotlib에서 기능들을 적용할 수가 있습니다.

 

2-5 df.iloc()

 iloc기능은 integer를 기반으로  row, column을 선택하는 기능입니다. 

 

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',',header=None,index_col= None)

data1.iloc[0] # 첫번째 행 전체
data1.iloc[0,] # 첫번째 행 전체
data1.iloc[:,0] # 작동이 안됨. row만 가능함.
data1.iloc[:,0] # 첫번째 열 전체
data1.iloc[:,[0,3]] # 첫번째,네번째 열 전체
data1.iloc[1,1] # 2번째 행의 2번째열

 

2-6 df.loc()

 loc기능은 iloc와 다르게 label을 기반으로 데이터를 가지고 올 수 있습니다. label기반이라고 한 이유는 이 포스팅에서 사용하고 있는 iris 데이터를 이용하여 분석했을 경우 위와 동일하게 작동이 됩니다. 그리고 만약에 index(row), column에 character가 있을 경우 해당 character를 넣어서 데이터 추출이 가능합니다.

 

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',',header=None,index_col= None)
data1.columns = ['a','b','d','c','e']

data1.loc[:,'c'] # c열에 있는 데이터 모두 가져오기
data1.loc[:,['a','c']] # a,c열에 있는 데이터 모두 가져오기

 

2-7.df.assign()

 column을 추가할 때, 그리고 기존값을 그대로 사용하거나, 값을 추가해서 column을 생성할 수도 있습니다.

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',',header=None,index_col= None)
data1 = data1.assign(test_col=data1[0])
data1 = data1.assign(test_col1=data1[0]+10)

 

2-8 df.query()

 query하면 떠오르는 것이 있다면, SQL입니다. 이 기능은 쉽게 데이터를 필터 할 수가 있습니다. 아주 유용하게 사용할 수 있을듯 합니다.

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',',header=None,index_col= None)
# 숫자 column은 다루기 까다로우니 임의의 column값을 줍니다.
data1.columns = ['a','b','c','d','e']
data1_q = data1.query('a > 6 and b < 2.5')

data1_q의 결과값

2-9 df.sort_values()

 값들을 sort해주는 기능입니다. 그리고 다양한 column들에 대해서도 sort가 가능합니다.  저는 이 기능을 몰라서 lambda이용해서 데이터에 적용하곤 했습니다.

 

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',',header=None,index_col= None)
# a, c 차례 기준으로 내림차순 정열
data1.sort_values(by=['a','c'],ascending = False)

a, c 차례를 기반으로 오름차순 정렬

 

2-10 df.sample()

sample은 R에서와 유사하게 랜덤으로 골라주는 기능입니다. 

개수 조절이 가능하고, random이기 때문에 seed도 맞출 수 있습니다. axis를 통해 row, column 모두 랜덤 추출이 가능합니다.

# random_state가 seed 넘버입니다.
data1_sample = data1.sample(n=2,random_state=1)
# axis 가 default는 0이고, 0은 row입니다. 1로 변경될 경우 column이 됩니다.
data1_sample = data1.sample(n=2,random_state=1,axis = 1)

 

2-11 df.isnull()

 R에서도 비슷한 기능이 있습니다. is.null(), is.na() etc. Missing value를  boolean 형태로 찾아주는 형태입니다.

 

test = {'a':[1,None,None,2],'b':[1,3,3,2]}
test_pd = pd.DataFrame(test)
test_pd.isnull()

 

2-12 df.fillna()

 na 값들을 어떤 값으로 대체 할것인지 결정하는 기능입니다. 유용할 것 같지만, 잘 생각해보고 쓰셔야 합니다. 다른 유사 분석에는 어떤 방법을 이용했는지 보고 NA를 채우시길 바랍니다.

 

value : 는 missing value에 그냥 특정값을 채우는 경우입니다.

method : ffill (forward-fill), bfill(backward-fill), interpolate, pad, backfill 등의 방법이 있습니다.

 ffill의 경우 앞의 값들을 NA값으로 채우는 방법이고, bfill의 경우 바로 뒤의 값들을 NA로 채우는 방법입니다.

axis : column기준으로 적용할것인지 row로 적용할것인지 입니다.

limit : 최대값 한계지정

inplace : 변경한 값을 바로 지정할지 -> default가 False이기 때문에 raw데이터는 변경이 안됨니다.

 

test_pd.fillna(method='ffill')
test_pd.fillna(method='bfill')
test_pd.fillna(0)

순서대로 ffill, bfill, 0 의 결과

2-13 df.dropna()

 말그대로 NA값들을 drop (없애기)시킨다. axis에 따라 row, column 기준이 달라진다. 그리고 thresh가 있는데, 특정 데이터에 thresh 이상의 NA가 아닌 값이 있을 경우 유지시킵니다.

 

test = {'a':[1,None,None,2],'b':[1,3,3,2],'c':[None,3,None,4]}
test_pd = pd.DataFrame(test)
# 열에서 3개 이상의 NA가 아닌 값이 있을 경우 추출
test_pd.dropna(axis=1,thresh=3)
# 행에서 2개 이상의 NA가 아닌 값이 있을 경우 추출
test_pd.dropna(axis=0,thresh=2)

raw data, 열에서 필터, 행에서 필터

2-14 df.drop()

뜻 그대로 column혹은 row를 버리는 기능입니다. label기반으로 작동이 됩니다. 다양하게 drop시키기 위해서는 list를 이용합니다. 

 

data1.drop([3,4])
data1.drop(['a','c'],axis=1)

 

 

2-15 pd.pivot_table()

pivot table은 데이터의 특징들을 기반으로 데이터를 집계하거나 요약할 수 있는 테이블입니다. index를 다양하게 추가 할 수가 있습니다.

 

# data1에서 e를 기반으로 d값들의 합을 나타냄
pivot_table = pd.pivot_table(data1,index='e',values = 'd',aggfunc = 'sum')
# data1에서 e를 기반으로 d값들의 개수를 나타냄
pivot_table = pd.pivot_table(data1,index='e',values = 'd',aggfunc = 'count')
# data1에서 e를 기반으로 d값들의 합과 개수를 나타냄
pivot_table = pd.pivot_table(data1,index='e',values = 'd',aggfunc = ['sum','count'])

2-16 df.groupby()

 데이터 내에 그룹을 나누어서 분석에 이용할 수도 있습니다. pivot_table()처럼 index를 추가해서 세부 그룹을 만들어 분석도 가능합니다(index 추가하기 위해서는 list를 이용해야 합니다.).

 

grouped = data1.groupby('e')
grouped.mean()

 

2-17 df.transpose()

 row와 column을 변경해주는 기능입니다. df.T와 같은 기능을 합니다.

 

2-18 df.merge()

 R에서와 마찬가지로 데이터를 합치는데 이용합니다. 중요하니 따로 찾아서 자세하게 보시길 바랍니다.

 

df1 = pd.DataFrame({'data1': ['A', 'B', 'C', 'D'],
                   'value': [1, 2, 3, 4]})
df2 = pd.DataFrame({'data1': ['B', 'F', 'D', 'F'],
                   'value': [5, 6, 7, 8]})

# data1을 기반으로 합치기
merged_df = df1.merge(df2, on='data1')
# data1을 기반으로 합치는데 없는 데이터는 NA처리
merged_df = df1.merge(df2, on=['data1'],how='outer')

df1, df2, merge결과
how를 outer처리함.

2-19 df.rename()

column, row name을 변경할때 사용합니다. 

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',',header=None,index_col= None)
# 상위 3개만 가져옴
data1_head = data1.head(3)
# rename
data1_head=data1_head.rename(index={0:'1st',1:'2nd',2:'3st',3:'4nd'})
data1_head=data1_head.rename(columns={0:'Sp_length',1:'Sp_width',2:'Pt_length',3:'Pt_width'})

 

위 방법 말고 다음과 같은 방법도 있습니다.

import pandas as pd
data1=pd.read_csv('./Downloads/iris.data',sep=',',header=None,index_col= None)
data1_head = data1.head(3)
data1_head.columns = ['Sp_length','Sp_width','Pt_length','Pt_width','type']

 위의 문제점은 데이터의 개수만큼 값들을 지정해야합니다. 즉 column이 5개면 5개의 변수를 넣어야하는 단점이 있습니다. rename의 경우는 그렇지가 않죠.

 

 

2-20 df.to_csv()

 데이터를 저장 할때 사용하고, default가 ','이고, sep를 통해서 다양한 방식으로 저장이 가능하고, columns을 통해서 특정 데이터만 저장할 수가 있습니다. 그리고 default option이 index가 True인데 이럴 경우 row에 이름이 지정되어 있지 않는 이상 숫자가 붙어서 데이터를 생성하게 됩니다. 이럴땐, index = False라고 써주시면, row name을 따로 저장 하지 않습니다. 그리고 NA 값에 대해서 na_rep을 통해서 대체 값들을 지정할수 있게 됩니다.

# tsv로 저장
data1.to_csv('저장할 위치', sep= '\t' )
# rowname 저장안함
data1.to_csv('저장할 위치', index = False)

 

3. 마치며

 

이렇게 pandas에서 유용하게 사용될 만한 기능들을 정리해보았습니다. 위 기능만 알아도 pandas기반으로 데이터를 다루는데 큰 문제가 없을 거라는 생각이 듭니다(만약 아니라면 추가하고 싶은 기능들을 댓글로 알려주세요 업데이트 하겠습니다.).

728x90
반응형

댓글