본문 바로가기
IT & 데이터 사이언스/Python

[Python Data Analytics] Pandas를 활용한 데이터 조작(1)

by 바른 호랑이 2023. 5. 20.
728x90
반응형

안녕하세요. 바른 호랑이입니다.

이번 게시글에서는 Python 데이터 분석의 기초라 할 수 있는 Pandas를 활용한 데이터 분석 방법에 대해 알아볼 계획입니다. 

데이터 분석 업무는 데이터를 수집하고 정리하는 일이 전부라고 할 수 있을 정도로 데이터 수집 및 가공은 기초적이면서 가장 중요한 일이라고 할 수 있습니다. Pandas는 Python언어를 기반으로 한 Open source Library로 데이터를 수집하고 정리하는데 최적화된 도구이기에 이를 학습하여 적재적소에 활용할 수 있다면 데이터 분석업무를 보다 효과적으로 수행할 수 있습니다. 데이터의 형태나 속성은 매우 다양하며, 이를 분석하기 위해서는 컴퓨터가 이해할 수 있는 형식을 가지는 구조로 통합할 필요가 있습니다. Pandas는 이를 위해 데이터들을 여러 종류의 클래스(Class)로 가공할 수 있는 여러가지 도구들을 제공하는데 일반적으로 시리즈(Series : 1차원 배열)와 데이터프레임(DataFrame : 2차원 배열)이 주로 사용됩니다.

이를 보다 쉽고 직관적으로 알아보기 위해 실제 코드를 작성해보며 알아볼 예정이며, 원래는 이를 활용하기 위해서는 Anaconda와 같은 여러 프로그램들의 설치가 필요하지만 Google에서 제공하는 Colab을 활용하면 별도의 복잡한 환경설정을 할 필요없이 진행할 수 있으므로 Colab을 활용해 실습을 진행할 예정입니다. Colab에 대해 보다 자세히 알고 싶으시면 아래의 사이트를 참조하시면 되겠습니다.

 

Google Colaboratory

 

colab.research.google.com

※ 실습파일

Python_DataAnalysis_01(Pandas).ipynb
0.02MB

## Pandas 설치 
!pip install pandas
# Pandas 불러오기
import pandas as pd

'''
Series 클래스란?
: 데이터가 순차적으로 나열된 1차원 형태의 배열 / index와 value값이 1:1로 매핑되며, Python의 Dictionary와 비슷한 구조를 가짐
'''
# key:value 쌍으로 dictionary를 생성 후 저장
dict_data = {'a':1, 'b':2, 'c':3}

# Pandas Series() 함수로 dictionary를 Series로 변환.

sr = pd.Series(dict_data)

# 결과 출력
print (f'{type(sr)}\n{sr}')

'''
index 구조란?
: index는 데이터의 값의 순서와 주소를 저장하며, 인덱스를 활용하면 보다 효율적으로 데이터 값의 탐색, 정렬, 선택, 결합등의 데이터 조작을 쉽게 할 수 있음
'''
# List 자료구조를 Series로 변환 후 저장
list_data = ['2023-05-20', 3.14, 'abc', 100, True]
sr = pd.Series(list_data)

# 결과 출력
print(sr)

# index 배열과 value 배열을 따로 저장
idx_arr = sr.index
val_arr = sr.values

# 결과 출력
print(f'\n{idx_arr}\n\n{val_arr}')

# 숫자가 아닌 인덱스 부여하여 Series 생성
tup_data = ('John', '2000-01-23', 'Male', 'True') 
index_data = ['Name', 'birth', 'sex', 'active'] # 인덱스이름을 선언하지 않으면 정수형 위치인덱스로 표기되어 출력됨
sr = pd.Series(tup_data, index=index_data)

# 결과 출력
print(f'\n{sr}')

# index를 활용한 데이터 호출
print(f'\n{sr[0]} / {sr["Name"]}')
# 정수형 위치 인덱스 사용시 0부터 시작하며 마지막 숫자의 인덱스는 호출 X  But, 인덱스 이름으로 호출시에는 해당 인덱스 이름까지(마지막 인덱스) 데이터 값 호출
print(f'\n{sr[0:2]}\n\n{sr["Name":"sex"]}')
# Pandas 불러오기
import pandas as pd
'''
DataFrame이란?
: 행과 열로 만들어지는 2차원 배열로 Excel과 RDBMS의 테이블과 유사하며, 여러개의 Series를 모아 놓은 집합임.
'''
# dictionary로 2차원 배열 정의
dict_data = {'a1' : [1, 2, 3], 'a2' : [4, 5, 6], 'a3' : [7, 8, 9], 'a4' : [10, 11, 12], 'a5' : [13, 14, 15]}

# Pandas DataFrame() 함수로 dictionary를 dataframe으로 전환
df = pd.DataFrame(dict_data)

# 결과 출력 
print(f'{type(df)}\n{df}')

# 행렬 이름 설정
df = pd.DataFrame([[0, 0, 0], [1, 1, 1], [2, 2, 2]], index=['1st', '2nd', '3rd'], columns=['column_1', 'column_2', 'column_3'])

# 결과 출력
print(f'\n{df}\n{df.index}\n{df.columns}')

# 행 인덱스 및 열 이름 변경
df.index = ['4th','5th', '6th']
df.columns = ['column_4', 'column_5', 'column_6']

# 결과 출력
print(f'\n{df}\n{df.index}\n{df.columns}')

# 행 인덱스 및 열 이름 변경
df.rename(columns={'column_4' : 'column_1'}, inplace=True) # inplace는 현재 객체에 바로 적용할 것인지 여부를 결정하는 옵션 
df.rename(index={'4th' : '1st'}, inplace=True)

# 결과 출력
print(f'\n{df}\n{df.index}\n{df.columns}')

# 행렬 복제 후 행렬 삭제
df2 = df[:].copy()
df2.drop('column_6', axis=1, inplace=True) # 열 삭제 / axis = 0이면 행삭제 & 1이면 열삭제
df3 = df[:].copy()
df3.drop('6th', axis=0, inplace=True) # axis값을 입력하지 않으면 0으로 적용됨

# 결과 출력
print(f'{df}\n\n{df2}\n\n{df3}')

# 행 선택 - loc와 행 이름을 활용한 추출, iloc를 활용한 행 선택
print(f'\n{df.loc["1st"]}\n\n{df.iloc[0]}') 
print(f'\n{df.loc[["1st", "5th"]]}\n\n{df.iloc[[0,1]]}') 
print(f'\n{df.loc["1st":"5th"]}\n\n{df.iloc[0:1]}') # 범위 선택시 정수형 위치인덱스는 마지막 값 미포함됨.

# 열선택
print(f'\n{df["column_1"]}')
print(f'\n{df[["column_1"]]}')
print(f'\n{df[["column_1", "column_5"]]}')

# 범위 슬라이싱 고급활용 - DataFrame.iloc[시작인덱스:끝인덱스:슬라이싱 간격]
# df.iloc[::2] - 처음부터 끝까지 2행 간격으로 선택
# 결과 출력
print(f'{df.iloc[::2]}')

# 행렬 동시 선택
print(f'{df.loc["1st":"6th", "column_1":"column_5"]}') # 인덱스 이름을 활용한 행렬 동시선택
print(f'{df.iloc[0:2, 0:2]}') # 정수형 위치 인덱스를 활용한 행렬 동시선택

# 원소선택- 범위가 아닌 정확한 위치를 지정할 때는 정확히 해당위치 값의 좌표로 해당 값 추출
print(f'\n{df.loc["5th", "column_6"]} & {df.iloc[1, 2]}')

# 열 추가
df4 = df.copy()
df4['column_7'] = 4
df5 = df.copy()
df5['column_7'] = [4, 5, 6]

print(f'\n{df4}\n\n{df5}')

# 행 추가
df6 = df.copy()
df6.loc["7th"] = 4
df7 = df.copy()
df7.loc["7th"] = [4, 5, 6]
df8 = df.copy()
df8.loc['7th'] = df8.iloc[0, :]

# 결과 출력
print(f'\n{df6}\n\n{df7}\n\n{df8}')

# 원소 값 변경 1
df.loc['1st', 'column_1'] = 999
df.loc['1st']['column_5'] = 7
df.iloc[1, 0] = 888

# 결과 출력
print(df)

# 행열 위치바꾸기 : 선형대수학의 전치행렬과 같은 개념
df9 = df.transpose()
df10 = df.T

print(f'\n{df}\n\n{df9}\n\n{df10}')

P.S 더 나은 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

728x90
반응형

댓글