Codong's Development Diary RSS 태그 관리 글쓰기 방명록
2021-03-08 21:58:06

개요


대게는 데이터를 csv 파일이나 excel파일, txt파일로 접하게 되었다. 하지만 이 데이터들을 파이썬에 옮겨서 지지든, 볶든, 어떻게든 요리하고 싶다면 어쩌면 좋을까? 엑셀처럼 다룰 수 있으면 얼마나 좋을까? 그래서 준비한게 PANDAS 라이브러리다!

pandas 란?

pandas는 데이터 조작 및 분석을 위해 Python 프로그래밍 언어로 작성된 소프트웨어 라이브러리다. 특히 숫자 테이블과 시계열을 조작하기위한 데이터 구조와 연산을 제공힌다. 그리고 pandas의 DataFrame은 여러 개의 Series들의 조합으로 구성되어 있다. 뒤에 예제를 통해 알 수 있다.

글로만 봐선 잘 모르겠다... 어서 시작해보자!

 

Pandas 요리하기


1. DataFrame 생성하기

생성하는 것은 상당히 쉽다. 제일 먼저 pandas 라이브러리를 pip install pandas로 설치한 후 import 하고 생성하자!

 import pandas as pd # pd로 줄여 사용하는게 국룰

 # 1) 딕셔너리로 생성하기 dic의 key가 컬럼이 되고, value가 값이 된다.
 data={'name':['철수','영희'],'Phone_num':['01033334444','01011112222']}
 df = pd.DataFrame(data,index=['1번','2번'])

 # 2) 이중 리스트로 만들기
 data=[
     ['철수','01033334444'],
    ['영희','01011112222']
         ]
 # 또는 np.array로 만들기
 data=np.array([
    ['철수','01033334444'],
    ['영희','01011112222']
    ])

 df = pd.DataFrame(data,columns=['name','phone_num'],index=['1번','2번'])

 print(df)
 # 출력  name     phone_num
 # 1번   철수        01033334444
 # 2번   영희        01011112222

DataFrame 에는 인풋으로 다음과 같이 넣어줘야 한다. pd.DataFrame(value, index, columns) 에서 value의 shape이 (n,m)인 행열이 있다면, index의 길이(len(indax))와 n이 같아야 하고, columns의 길이(len(columns))가 m과 같아야 한다. 어찌보면 당연한 건데 헷갈린다,,

2. 열 / 행 추출

df의 매력적인 부분이 원하는 행, 또는 열을 쉽게 가져올 수 있다. 위 예제를 그대로 사용하여 이름 _열 데이터_만 가져오고 싶다면,

 print(df.name)
 # 또는
 print(df['name'])
 # 또는 iloc은 숫자로 접근. 컴마로 열부분임을 명시
 print(df.iloc[:,0])
 # 또는 loc은 값으로 접근
 print(df.loc[:,'name'])

 # 출력
 # 1번    철수
 # 2번     영희
 # Name:name, dtype: object

반대로 행의 데이터에 접근하고 싶다면,

 # iloc은 그 행의 번호(숫자)로 접근한다.
 print(df.iloc[0])
 # 또는 리스트처럼 인덱스 슬라이싱한다.
 print(df[:1])
 # 또는 loc은 index의 값으로 접근한다.
 print(df.loc['1번'])


 # 출력
 # name             철수
 # phone_num    영희
 # Name: 1번, dtype: object

이 둘의 공통점은 Series 객체로 반환된다. 이 Series를 이용하여 더 멋진 인덱싱이 가능하다!

3. 조건에 맞는 데이터 추출

실제 데이터들은 정말 많고 많을 것이다. 위의 예제의 경우 이름이 철수인 데이터만 보고 싶을 땐 어떻게 하면 좋을까? Series를 이용하면된다!

print(df['name']=='철수')
# 출력
# 1번    True
# 2번    False
# Name: name. dtype: bool

# 본 df의 인덱스로 넣어주면 철수에 해당한 값만 가진 dataframe 출력
df[df['name']=='철수']

# 출력   name     phone_num
# 1번    철수        01033334444

위 코드를 실행하면 DataFrame에서 철수가 포함되는 행의 데이터는 True로 이루어진 boolean형태의 시리즈를 반환한다. 이 시리즈를 이용하여 본 데이터 프레임안에 넣어주면 True인 행, 즉 철수인 행만 출력이 된다.

4. 열 / 행 추가 및 수정

열 추가는 상당히 간단하다. 열을 추출할 때처럼 추가 시킬 column명을 적고, index의 길이에 맞춰 값을 리스트로 추가해주면 된다.

# 추가
df['sex']=['남','여']
print(df)
# 출력    name    phone_num    sex
# 1번    철수        01033334444    남
# 2번     영희        01011112222    여

# 수정 
df['phone_num']=['01034567890','01012345678']
print(df)
# 출력    name    phone_num    sex
# 1번    철수        01034567890    남
# 2번     영희        01012345678    여

행의 수정도 같은 맥락이다.

# 추가
df = df.append({'name':'코린','phone_num':'01025552223','sex':'남'},ignore_index=True)

# 인덱스까지 추가하고 싶다면 series로 만들어 추가
add_row=pd.Series({'name':'코린','phone_num':'01025552223','sex':'남'},name='3번')
df=df.append(add_row)

# 출력    name    phone_num    sex
# 1번    철수        01034567890    남
# 2번     영희        01012345678    여
# 3번    코린        01025552223    남

# 수정
df.iloc[1]=['희영','폰없음','남']

# 출력    name    phone_num    sex
# 1번    철수        01034567890    남
# 2번     희영        폰없음           남
# 3번    코린        01025552223    남

append를 이용하면, index가 상관없으면 위 처럼 딕셔너리 형태로 적용, ignore_index옵션 True로 해줘야함. 그렇지만, append만 하면 리스트처럼 바로 적용되지 않는다. 그래서 위와 같이 df = df.append()처럼 값을 재정의 해준다.

5. 자주쓰는 속성

데이터들을 표로 관리하는 것도 좋지만, 다른 모델의 인풋으로 넣어줘야 할 때가 있다. 그래서 자주 쓰는 메서드들을 적어보았다.

  1. index 가져오기
print(df.index)

# 출력
Index(['1번','2번','3번'], dtype='object')

# 리스트로 가져오기
index_list = df.index.to_list
print(index_list)

# 출력
['1번','2번','3번']
  1. columns 가져오기
print(df.index)

# 출력
Index(['name','phone_num','sex'], dtype='object')

# 리스트로 가져오기
columns_list = df.index.to_list
print(columns_list)

# 출력
['name','phone_num','sex']
  1. values 가져오기 array 객체로 다른 모델의 인풋으로 많이 사용한다.
print(df.values)

# 출력
array([['철수','01034567890','남'],
        ['희영','폰없음','남'],
        ['코린','01025552223','남']], dtype='object')

마무리


항상 편리한 도구들은 많다고 생각한다. 내가 어떤 작업을 할것인지, 그 작업에 가장 효율적인 도구를 찾아 사용하는 것이 제일 중요하다고 생각한다. 그렇지만 모르면 못쓴다^^ 찾아보고 까먹지 않게 한 번 썼을 때 정리 잘해놓자 !