본문 바로가기
Python/Python 기초

[파이썬완전기초]데이터다루기Pandas기본

by 찐남 2021. 7. 29.
본 포스팅은 2021 NIPA AI 온라인 무료 교육의 AI 실무 기본 과정을 기반으로 작성하였습니다.

 

1. Pandas


Pandas는 파이썬에서 제공하는 모듈(라이브러리)로 구조화된 데이터를 효과적으로 처리하고 저장할 때 유용하게 사용될 수 있습니다. Array 계산에 특화된 Numpy를 기반으로 설계되었습니다.

1.1. Series


Series 데이터는 Numpy의 array가 보강된 형태로 Data와 Index를 가지고 있습니다. 아래 간단한 예시를 보겠습니다.

import pandas as pd # pandas 라이브러리 호출
data = pd.Series([1, 2, 3, 4])
print(data)


data = pd.Series([1, 2, 3, 4]) 는 pandas 라이브러리에 있는 Series 함수를 이용하여 1, 2, 3, 4의 원소를 가지는 Series Data를 생성하여 data에 저장하라는 명령문입니다. 출력 결과는 아래와 같습니다.

0 1
1 2
2 3
3 4
dtype: int64


맨 왼쪽에 있는 숫자는 인덱스를 의미합니다. 데이터 형식은 int64 임을 알 수 있습니다.

Series는 값(values)을 ndarray형태로 가지고 있습니다. 아래 예시를 보겠습니다.

import pandas as pd
data = pd.Series([1, 2, 3, 4])

print(data) # data 출력
print(type(data)) # data 형태 출력
print(data.values) # data에 저장되어 있는 값 출력
print(type(data.values)) # data에 저장되어 있는 값의 형태 출력


출력 결과는 아래와 같습니다.

0 1
1 2
2 3
3 4
dtype: int64

<class 'pandas.core.series.Series'>

[ 1 2 3 4 ]

<class 'numpy.ndarray'>


Series에 저장되는 데이터 값의 형태는 numpy 라이브러리에서 제공하는 ndarray 형태임을 알 수 있습니다.

Series 함수의 인수를 사용해서 데이터 형식을 변경할 수 있습니다. 아래 예시를 보겠습니다.

import pandas as pd
data = pd.Series([1, 2, 3 ,4], dtype = "float") # Series 데이터 형태를 실수형으로 지정


출력결과는 아래와 같습니다.

0 1.0
1 2.0
2 3.0
3 4.0
dtype: float64


아래 예시처럼 인덱스를 새로 정의하여 사용할 수도 있습니다.

import pandas as pd
data = pd.Series([1, 2, 3, 4], index = ['a', 'b', 'c', 'd']) # Series 데이터에 인덱스 지정
print(data)


출력 결과는 아래와 같습니다.

a 1
b 2
c 3
d 4
dtype: int64


인덱스를 이용해서 데이터 값을 변경할 수 있습니다.

import pandas as pd
data = pd.Series([1, 2, 3, 4], index = ['a', 'b', 'c', 'd'])

data['c'] = 10 # c 인데스 위치에 10을 저장
print(data)


출력 결과는 아래와 같습니다.

a 1
b 2
c 10
d 4
dtype: int64


c 인덱스 위치에 있는 값이 10으로 변경되었음을 확인할 수 있습니다.

딕셔너리를 이용해서 Series 데이터를 생성할 수 있습니다.

import pandas as pd
population_dic = {
__'china' : 141500,
__'japan' : 12718,
__'korea' : 5180,
__'usa' : 32676
}

population = pd.Series(population_dic)
print(population)


실행결과는 아래와 같습니다.

china 141500
japan 12718
korea 5180
usa 32676
dtype: int64

 



2. Data Frame


데이터 프레임은 여러개의 Series 가 모여서 행과 열을 이룬 데이터입니다. 실제 데이터 분석을 할 때, 가장 많이 다루게 되는 데이터 형식입니다.

2.1. Series를 이용한 데이터 프레임 생성

 

import pandas as pd

population_dic = {
____'china' : 141500,
____'japan' : 12718,
____'korea' : 5180,
_____'usa' : 32676
}
population = pd.Series(population_dic)

gdp_dic = {
____'china' : 1409250000,
____'japan' : 516700000,
____'korea' : 169320000,
____'usa' : 2041280000
}
gdp = pd.Series(gdp_dic)

country = pd.DataFrame({
____'gdp' : gdp,
____'population' : population
})

print(country)


출력 결과는 아래와 같습니다.

gdp population
china 1409250000 141500
japan 516700000 12718
korea 169320000 5180
usa 2041280000 32676

 

2.2. 딕셔너리를 이용한 데이터 프레임 생성


딕셔너리를 이용해서도 데이터 프레임을 생성할 수 있습니다. 아래 예시를 참고하세요.

import pandas as pd

data = {
____'country' : ['china', 'japan', 'korea', 'usa'],
____'gdp' : [1409250000, 516700000, 169320000, 2041280000],
____'population' : [141500, 12718, 5180, 32676]
}

country = pd.DataFrame(data)
country = country.set_index('country')


출력 결과는 위의 예시와 거의 유사함을 확인할 수 있습니다.

country gdp population
china 1409250000 141500
japan 516700000 12718
korea 169320000 5180
usa 2041280000 32676

 

2.3. 데이터 프레임 속성 확인


데이터 프레임의 속성을 확인하는 방법은 아래와 같습니다.

# 위의 예시 프로그램 지속 활용

print(country.shape) # country 라는 데이터 프레임의 모양 출력
# (4,2)
print(country.size) # country 라는 데이터 프레임의 크기 출력
# 8
print(country.ndim) # country 라는 데이터 프레임의 차원 출력
# 2
print(country.values) # country 라는 데이터 프레임의 데이터 출력
# [[1409250000 141500]
# [ 516700000 12718]
# [ 169320000 5180]
# [2041280000 32676]]

 

2.4. 데이터 프레임의 index와 column에 이름 부여


데이터 프레임의 index에 column을 부여하여 사용할 수도 있습니다.

# 위의 예시 프로그램 지속 활용
country.index.name = 'country'
country.colunms.name = 'info'

print(country.index)
# Index(['china', 'japan', 'korea', 'usa'], dtype='object', name='country')
print(country.columns)
# Index(['gdp', 'population'], dtype='object', name='info')

 

2.5. 데이터 프레임 저장 및 불러오기


파이썬 외부의 데이터를 파이썬 내부로 불러올 수도 있고, 파이썬 내부 데이터 외부로 저장할 수도 있습니다.

import pandas as pd

country.to_csv("./country.csv") # 데이터를 CSV 파일로 내보내기
country.to_excel("country.xlsx") # 데이터를 엑셀로 내보내기

country = pd.read_csv("./country.csv") # CSV 데이터를 불러오기
country = pd.read_execl("country.xlsx") # 엑셀 데이터 불러오기

 

2.6 데이터 선택 및 변경하기


데이터 선택 방법은 indexing / slicing , 컬럼선택, 조건 활용 방법 등을 활용할 수 있습니다.

2.6.1. indexing / slicing


인덱스를 활용하여 데이터를 선택하는 방법에는 명시적인 방법과 파이썬 스타일의 정수 인덱싱/슬라이싱 방법이 있습니다.

명시적인 방법으로 선택하는 방법(.loc 이용)에 대한 예시를 보겠습니다.

import pandas as pd

data = {
____'country' : ['china', 'japan', 'korea', 'usa'],
____'gdp' : [1409250000, 516700000, 169320000, 2041280000],
____'population' : [141500, 12718, 5180, 32676]
}

country = pd.DataFrame(data)
country = country.set_index('country')

print(country.loc['china'])
print(country.loc['japan' : 'korea' , 'population'])


출력 결과는 아래와 같습니다.

gdp 1409250000
population 141500
Name: china, dtype: int64

country
japan 12718
korea 5180
Name: population, dtype: int64


파이썬 스타일의 정수 인덱싱/슬라이싱을 이용하는 방법(.iloc)은 아래와 같습니다. 결과는 명시적인 방법을 사용한 결과와 동일함을 확인할 수 있습니다.

print(country.iloc[0])
# gdp 1409250000
# population 141500
# Name: china, dtype: int64

print(country.iloc[1:2, 1])
# country
# japan 12718
# korea 5180
# Name: population, dtype: int64

 

2.6.2. 컬럼 활용 방법


컬럼을 활용하는 방법은 아래와 같습니다. 결과는 동일하나, 데이터 형태가 다름을 확인할 수 있습니다.

print(country['gdp']) # Series 데이터 형태
country
china 1409250000
japan 516700000
korea 169320000
usa 2041280000
Name: gdp, dtype: int64

print(country[['gdp']]) #Data Frame 형태
gdp
country
china 1409250000
japan 516700000
korea 169320000
usa 2041280000

 

2.6.3. 조건 활용 방법


일정한 조건식을 만족하는 행을 추출하는 방법도 있습니다. 이는 Masking 연산이나, query를 활용할 수 있습니다. 결과는 동일합니다.

country[country['population'] < 10000] # Masking 연산
# gdp population
# country
# korea 169320000 5180
country.query("population < 10000") # query 활용
# gdp population
# country
# korea 169320000 5180

 

2.6.4. 칼럼 추가


Series 데이터도 numpy array 처럼 연산자 활용이 가능합니다. 아래 예시를 보겠습니다.

gdp_per_capita = country['gdp'] / country['population']
country['gdp per capita'] = gdp_per_capita

 

2.6.7. 데이터 추가 및 수정


리스트로 추가할 수도 있고, 딕셔너리 형태로 추가할 수도 있습니다.

df = pd.DataFrame(columns = ['이름', '나이', '주소']) # 데이터 프레임 생성
df.loc[0] = ['길동', '26', '서울'] # 리스트로 데이터 추가
df.loc[1] = {'이름' : '철수', '나이' : '25', '주소' : '인천'} # 딕셔너리로 데이터 추가
df.loc[1, '이름'] = '영희' #명시적 데이터 활용하여 데이터 변경


NaN 으로 초기화 한 변수를 활용하여 새로운 값을 입력할 수도 있습니다.

df['전화번호'] = np.NaN # 새로운 컬럼 추가 후 초기화
df.loc[0, '전화번호'] = '01012345678' # 명시적 인덱스 활용하여 데이터 수정


컬럼을 삭제할 수도 있습니다.

df.drop('전화번호', axis = 1, inplace = TRUE) # 컬럼 삭제
# axis = 1 : 열방향 / axis = 0 : 행 방향
# inplace = True : 원본변경 / inplace = False : 원본변경 X


이상으로 pandas 라이브러리 기본에 대해서 살펴 보았습니다. 다음은 pandas 심화 내용을 살펴 보도록 하겠습니다.

반응형

댓글