판다스는 분석을 위해 다양한 소스로 부터 수집하는 데이터의 형태나 속성이 너무 다양하기 때문에 이를 동일한 형식을 갖는 구조로 통합하기 위해 쓴다. 이를 위해 시리즈(Series)와 데이터프레임(DataFrame)이라는 구조화된 데이터 형식을 제공한다. 시리즈는 1차원 배열, 데이터프레임은 2차원 배열.
시리즈(Series)
시리즈 만들기
# pandas 불러오기
import pandas as pd
# k:v 구조를 갖는 딕셔너리를 만들고, 변수 dict_data에 저장
dict_data = {'a': 1, 'b': 2, 'c': 3}
# 판다스 Series() 함수로 딕셔너리(dict_data)를 시리즈로 변환. 변수 sr에 저장
sr = pd.Series(dict_data)
# 변수 sr의 자료형 출력
print(type(sr))
print('\n')
# 변수 sr에 저장되어 있는 시리즈 객체를 출력
print(sr)
인덱스 구조
import pandas as pd
# 리스트를 시리즈로 변환하여 변수 sr에 저장
list_data = ['2019-01-02', 3.14, 'ABC', 100, True]
sr = pd.Series(list_data)
print(sr)
print('\n')
# 인덱스 배열은 변수 idx에 저장. 데이터 값 배열은 변수 val에 저장
idx = sr.index
val = sr.values
print(idx)
print('\n')
print(val)
원소 선택
import pandas as pd
# 투플을 시리즈로 변환(index 옵션에 인덱스 이름을 지정)
tup_data = ('영인', '2010-05-01', '여', True)
sr = pd.Series(tup_data, index=['이름', '생년월일', '성별', '학생여부'])
print(sr)
print('\n')
# 원소를 1개 선택
print(sr[0]) # sr의 1 번째 원소를 선택 (정수형 위치 인덱스를 활용)
print(sr['이름']) # '이름' 라벨을 가진 원소를 선택 (인덱스 이름을 활용)
print('\n')
# 여러 개의 원소를 선택 (인덱스 리스트 활용)
print(sr[[1, 2]])
print('\n')
print(sr[['생년월일', '성별']])
print('\n')
# 여러 개의 원소를 선택 (인덱스 범위 지정)
print(sr[1 : 2])
print('\n')
print(sr['생년월일' : '성별'])
데이터프레임
데이터프레임의 열은 공통의 속성을 갖는 일련의 데이터를 나타내고 행은 개별 관측대상에 대한 다양한 속성 데이터들의 모음인 레코드가 된다.
열은 종목 코드, 회사 이름, 액면가, 총 주식수 등 공통의 속성이나 범주를 나타내는데 보통 변수로 활용된다.
데이터프레임 만들기
import pandas as pd
# 열이름을 key로 하고, 리스트를 value로 갖는 딕셔너리 정의(2차원 배열)
dict_data = {'c0':[1,2,3], 'c1':[4,5,6], 'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}
# 판다스 DataFrame() 함수로 딕셔너리를 데이터프레임으로 변환. 변수 df에 저장.
df = pd.DataFrame(dict_data)
# df의 자료형 출력
print(type(df))
print('\n')
# 변수 df에 저장되어 있는 데이터프레임 객체를 출력
print(df)
행 인덱스/열 이름 설정
import pandas as pd
# 행 인덱스/열 이름 지정하여, 데이터프레임 만들기
df = pd.DataFrame([[15, '남', '덕영중'], [17, '여', '수리중']],
index=['준서', '예은'],
columns=['나이', '성별', '학교'])
# 행 인덱스, 열 이름 확인하기
print(df) #데이터프레임
print('\n')
print(df.index) #행 인덱스
print('\n')
print(df.columns) #열 이름
print('\n')
# 행 인덱스, 열 이름 변경하기
df.index=['학생1', '학생2']
df.columns=['연령', '남녀', '소속']
print(df) #데이터프레임
print('\n')
print(df.index) #행 인덱스
print('\n')
print(df.columns) #열 이름
행 인덱스/열이름 변경
import pandas as pd
# 행 인덱스/열 이름 지정하여, 데이터프레임 만들기
df = pd.DataFrame([[15, '남', '덕영중'], [17, '여', '수리중']],
index=['준서', '예은'],
columns=['나이', '성별', '학교'])
# 데이터프레임 df 출력
print(df)
print("\n")
# 열 이름 중, '나이'를 '연령'으로, '성별'을 '남녀'로, '학교'를 '소속'으로 바꾸기
df.rename(columns={'나이':'연령', '성별':'남녀', '학교':'소속'}, inplace=True)
# df의 행 인덱스 중에서, '준서'를 '학생1'로, '예은'을 '학생2'로 바꾸기
df.rename(index={'준서':'학생1', '예은':'학생2' }, inplace=True)
# df 출력(변경 후)
print(df)
행/열 삭제
- drop() 메소드를 사용
- 행을 삭제할 때는 축 옵션 axis = 0을 입력하거나, 생략
- 열을 삭제할 때는 축 옵션 axis = 1을 입력
- 동시에 여러 개의 행 또는 열을 삭제하려면 리스트 형태로 입력
- 원본 객체를 직접 변경하기 위해서는 inplace = True로 설정
import pandas as pd
# DataFrame() 함수로 데이터프레임 변환. 변수 df에 저장
exam_data = {'수학' : [ 90, 80, 70], '영어' : [ 98, 89, 95],
'음악' : [ 85, 95, 100], '체육' : [ 100, 90, 90]}
df = pd.DataFrame(exam_data, index=['서준', '우현', '인아'])
print(df)
print('\n')
# 데이터프레임 df를 복제하여 변수 df2에 저장. df2의 1개 행(row)을 삭제
df2 = df[:]
df2.drop('우현', inplace=True)
print(df2)
print('\n')
# 데이터프레임 df를 복제하여 변수 df3에 저장. df3의 2개 행(row)을 삭제
df3 = df[:]
df3.drop(['우현', '인아'], axis=0, inplace=True)
print(df3)
import pandas as pd
# DataFrame() 함수로 데이터프레임 변환. 변수 df에 저장
exam_data = {'수학' : [ 90, 80, 70], '영어' : [ 98, 89, 95],
'음악' : [ 85, 95, 100], '체육' : [ 100, 90, 90]}
df = pd.DataFrame(exam_data, index=['서준', '우현', '인아'])
print(df)
print('\n')
# 데이터프레임 df를 복제하여 변수 df4에 저장. df4의 1개 열(column)을 삭제
df4 = df.copy()
df4.drop('수학', axis=1, inplace=True)
print(df4)
print('\n')
# 데이터프레임 df를 복제하여 변수 df5에 저장. df5의 2개 열(column)을 삭제
df5 = df.copy()
df5.drop(['영어', '음악'], axis=1, inplace=True)
print(df5)
행 선택
- loc : 인덱스 이름을 기준으로 행을 선택할 때 사용
- iloc: 정수형 위치 인덱스를 사용
import pandas as pd
# DataFrame() 함수로 데이터프레임 변환. 변수 df에 저장
exam_data = {'수학' : [ 90, 80, 70], '영어' : [ 98, 89, 95],
'음악' : [ 85, 95, 100], '체육' : [ 100, 90, 90]}
df = pd.DataFrame(exam_data, index=['서준', '우현', '인아'])
print(df) # 데이터프레임 출력
print('\n')
# 행 인덱스를 사용하여 행 1개를 선택
label1 = df.loc['서준'] # loc 인덱서 활용
position1 = df.iloc[0] # iloc 인덱서 활용
print(label1)
print('\n')
print(position1)
print('\n')
# 행 인덱스를 사용하여 2개 이상의 행 선택
label2 = df.loc[['서준', '우현']]
position2 = df.iloc[[0, 1]]
print(label2)
print('\n')
print(position2)
print('\n')
# 행 인덱스의 범위를 지정하여 행 선택
label3 = df.loc['서준':'우현']
position3 = df.iloc[0:1]
print(label3)
print('\n')
print(position3)
열 선택
import pandas as pd
# DataFrame() 함수로 데이터프레임 변환. 변수 df에 저장
exam_data = {'이름' : [ '서준', '우현', '인아'],
'수학' : [ 90, 80, 70],
'영어' : [ 98, 89, 95],
'음악' : [ 85, 95, 100],
'체육' : [ 100, 90, 90]}
df = pd.DataFrame(exam_data)
print(df)
print(type(df))
print('\n')
# '수학' 점수 데이터만 선택. 변수 math1에 저장
math1 = df['수학']
print(math1)
print(type(math1))
print('\n')
# '영어' 점수 데이터만 선택. 변수 english에 저장
english = df.영어
print(english)
print(type(english))
print('\n')
# '음악', '체육' 점수 데이터를 선택. 변수 music_gym 에 저장
music_gym = df[['음악', '체육']]
print(music_gym)
print(type(music_gym))
print('\n')
# '수학' 점수 데이터만 선택. 변수 math2에 저장
math2 = df[['수학']]
print(math2)
print(type(math2))
원소 선택
- 데이터프레임의 행 인덱스와 열 이름을 [행,열] 형식의 2차원 좌표로 입력하여 원소 위치를 지정
import pandas as pd
# DataFrame() 함수로 데이터프레임 변환. 변수 df에 저장
exam_data = {'이름' : [ '서준', '우현', '인아'],
'수학' : [ 90, 80, 70],
'영어' : [ 98, 89, 95],
'음악' : [ 85, 95, 100],
'체육' : [ 100, 90, 90]}
df = pd.DataFrame(exam_data)
# '이름' 열을 새로운 인덱스로 지정하고, df 객체에 변경사항 반영
df.set_index('이름', inplace=True)
print(df)
print('\n')
# 데이터프레임 df의 특정 원소 1개 선택 ('서준'의 '음악' 점수)
a = df.loc['서준', '음악']
print(a)
b = df.iloc[0, 2]
print(b)
print('\n')
# 데이터프레임 df의 특정 원소 2개 이상 선택 ('서준'의 '음악', '체육' 점수)
c = df.loc['서준', ['음악', '체육']]
print(c)
d = df.iloc[0, [2, 3]]
print(d)
e = df.loc['서준', '음악':'체육']
print(e)
f = df.iloc[0, 2:]
print(f)
print('\n')
# df의 2개 이상의 행과 열로부터 원소 선택 ('서준', '우현'의 '음악', '체육' 점수)
g = df.loc[['서준', '우현'], ['음악', '체육']]
print(g)
h = df.iloc[[0, 1], [2, 3]]
print(h)
i = df.loc['서준':'우현', '음악':'체육']
print(i)
j = df.iloc[0:2, 2:]
print(j)
열 추가
import pandas as pd
# DataFrame() 함수로 데이터프레임 변환. 변수 df에 저장
exam_data = {'이름' : [ '서준', '우현', '인아'],
'수학' : [ 90, 80, 70],
'영어' : [ 98, 89, 95],
'음악' : [ 85, 95, 100],
'체육' : [ 100, 90, 90]}
df = pd.DataFrame(exam_data)
print(df)
print('\n')
# 데이터프레임 df에 '국어' 점수 열(column)을 추가. 데이터 값은 80 지정
df['국어'] = 80
print(df)
행 추가
import pandas as pd
# DataFrame() 함수로 데이터프레임 변환. 변수 df에 저장
exam_data = {'이름' : ['서준', '우현', '인아'],
'수학' : [ 90, 80, 70],
'영어' : [ 98, 89, 95],
'음악' : [ 85, 95, 100],
'체육' : [ 100, 90, 90]}
df = pd.DataFrame(exam_data)
print(df)
print('\n')
# 새로운 행(row)을 추가 - 같은 원소 값을 입력
df.loc[3] = 0
print(df)
print('\n')
# 새로운 행(row)을 추가 - 원소 값 여러 개의 배열 입력
df.loc[4] = ['동규', 90, 80, 70, 60]
print(df)
print('\n')
# 새로운 행(row)을 추가 - 기존 행을 복사
df.loc['행5'] = df.loc[3]
print(df)
원소 값 변경
import pandas as pd
# DataFrame() 함수로 데이터프레임 변환. 변수 df에 저장
exam_data = {'이름' : [ '서준', '우현', '인아'],
'수학' : [ 90, 80, 70],
'영어' : [ 98, 89, 95],
'음악' : [ 85, 95, 100],
'체육' : [ 100, 90, 90]}
df = pd.DataFrame(exam_data)
# '이름' 열을 새로운 인덱스로 지정하고, df 객체에 변경사항 반영
df.set_index('이름', inplace=True)
print(df)
print('\n')
# 데이터프레임 df의 특정 원소를 변경하는 방법: '서준'의 '체육' 점수
df.iloc[0][3] = 80
print(df)
print('\n')
df.loc['서준']['체육'] = 90
print(df)
print('\n')
df.loc['서준', '체육'] = 100
print(df)
print('\n')
# 데이터프레임 df의 원소 여러 개를 변경하는 방법: '서준'의 '음악', '체육' 점수
df.loc['서준', ['음악', '체육']] = 50
print(df)
print('\n')
df.loc['서준', ['음악', '체육']] = 100, 50
print(df)
행, 열의 위치 변경
- 데이터프레임의 행과 열을 서로 맞바꾸는 방법
- 전치의 결과로 새로운 객체로 반환하므로, 기존 객체를 변경하기 위해서는 df = df.transpose() 또는 df = df.T와 같이 기존 객체에 새로운 객체를 할당해주는 과정이 필요
import pandas as pd
# DataFrame() 함수로 데이터프레임 변환. 변수 df에 저장
exam_data = {'이름' : [ '서준', '우현', '인아'],
'수학' : [ 90, 80, 70],
'영어' : [ 98, 89, 95],
'음악' : [ 85, 95, 100],
'체육' : [ 100, 90, 90]}
df = pd.DataFrame(exam_data)
print(df)
print('\n')
# 데이터프레임 df를 전치하기 (메소드 활용)
df = df.transpose()
print(df)
print('\n')
# 데이터프레임 df를 다시 전치하기 (클래스 속성 활용)
df = df.T
print(df)
인덱스 활용
특정 열을 행 인덱스로 설정
- set_index()
- 원본 데이터프레임을 바꾸지 않고 새로운 데이터프레임 객체를 반환한다.
- 원본을 바꾸려면 inplace = True와 같이 inplace옵션을 추가해야 한다.
import pandas as pd
# DataFrame() 함수로 데이터프레임 변환. 변수 df에 저장
exam_data = {'이름' : [ '서준', '우현', '인아'],
'수학' : [ 90, 80, 70],
'영어' : [ 98, 89, 95],
'음악' : [ 85, 95, 100],
'체육' : [ 100, 90, 90]}
df = pd.DataFrame(exam_data)
print(df)
print('\n')
# 특정 열(column)을 데이터프레임의 행 인덱스(index)로 설정
ndf = df.set_index(['이름'])
print(ndf)
print('\n')
ndf2 = ndf.set_index('음악')
print(ndf2)
print('\n')
ndf3 = ndf.set_index(['수학', '음악'])
print(ndf3)
행 인덱스 재배열
- reindex()
- 기존 데이터프레임에 존재하지 않는 행 인덱스가 새롭게 추가되는 경우 그 행의 데이터 값은 NaN값이 입력된다.
- NaN 대신 유효한 값을 채우려면 fill_value 옵션에 원하는 값을 입력한다.
import pandas as pd
# 딕셔서리를 정의
dict_data = {'c0':[1,2,3], 'c1':[4,5,6], 'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}
# 딕셔서리를 데이터프레임으로 변환. 인덱스를 [r0, r1, r2]로 지정
df = pd.DataFrame(dict_data, index=['r0', 'r1', 'r2'])
print(df)
print('\n')
# 인덱스를 [r0, r1, r2, r3, r4]로 재지정
new_index = ['r0', 'r1', 'r2', 'r3', 'r4']
ndf = df.reindex(new_index)
print(ndf)
print('\n')
# reindex로 발생한 NaN값을 숫자 0으로 채우기
new_index = ['r0', 'r1', 'r2', 'r3', 'r4']
ndf2 = df.reindex(new_index, fill_value=0)
print(ndf2)
행 인덱스 초기화
- reset_index()
- 행 인덱스를 정수형 위치 인덱스로 초기화
- 기존 행 인덱스는 열로 이동
import pandas as pd
# 딕셔서리를 정의
dict_data = {'c0':[1,2,3], 'c1':[4,5,6], 'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}
# 딕셔서리를 데이터프레임으로 변환. 인덱스를 [r0, r1, r2]로 지정
df = pd.DataFrame(dict_data, index=['r0', 'r1', 'r2'])
print(df)
print('\n')
# 행 인덱스를 정수형으로 초기화
ndf = df.reset_index()
print(ndf)
행 인덱스를 기준으로 데이터프레임 정렬
- sort_index()
- 행 인덱스를 기준으로 데이터프레임의 값을 정렬한다.
- ascending옵션을 사용, 오름차순 또는 내림차순으로 정렬한다.
- ascending = False 는 내림차순 정렬, True는 오름차순 정렬
import pandas as pd
# 딕셔서리를 정의
dict_data = {'c0':[1,2,3], 'c1':[4,5,6], 'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}
# 딕셔서리를 데이터프레임으로 변환. 인덱스를 [r0, r1, r2]로 지정
df = pd.DataFrame(dict_data, index=['r0', 'r1', 'r2'])
print(df)
print('\n')
# 내림차순으로 행 인덱스 정렬
ndf = df.sort_index(ascending=False)
print(ndf)
열 기준 정렬
- solt_values()
- 특정 열을 기준으로 데이터프레임을 정렬
import pandas as pd
# 딕셔서리를 정의
dict_data = {'c0':[1,2,3], 'c1':[4,5,6], 'c2':[7,8,9], 'c3':[10,11,12], 'c4':[13,14,15]}
# 딕셔서리를 데이터프레임으로 변환. 인덱스를 [r0, r1, r2]로 지정
df = pd.DataFrame(dict_data, index=['r0', 'r1', 'r2'])
print(df)
print('\n')
# c1 열을 기준으로 내림차순 정렬
ndf = df.sort_values(by='c1', ascending=False)
print(ndf)
산술연산
판다스 객체의 산술연산은 내부적으로 3단계 프로세스를 거친다. 1. 행/열 인덱스를 기준으로 모든 원소를 정렬한다. 2. 동일한 위치에 있는 원소끼리 일대일로 대응시킨다. 3. 일대일 대응이 되는 원소끼리 연산을 처리한다. 이때 대응되는 원소가 없으면 NaN으로 처리한다.
시리즈 연산
시리즈 vs 숫자
- 시리즈 객체의 각 원소를 200으로 나누는 과정
# 라이브러리 불러오기
import pandas as pd
# 딕셔너리 데이터로 판다스 시리즈 만들기
student1 = pd.Series({'국어':100, '영어':80, '수학':90})
print(student1)
print('\n')
# 학생의 과목별 점수를 200으로 나누기
percentage = student1 / 200
print(percentage)
print('\n')
print(type(percentage))
시리즈 vs 시리즈
- 시리즈와 시리즈 사이에 사칙연산
# 라이브러리 불러오기
import pandas as pd
# 딕셔너리 데이터로 판다스 시리즈 만들기
student1 = pd.Series({'국어':100, '영어':80, '수학':90})
student2 = pd.Series({'수학':80, '국어':90, '영어':80})
print(student1)
print('\n')
print(student2)
print('\n')
# 두 학생의 과목별 점수로 사칙연산 수행
addition = student1 + student2 #덧셈
subtraction = student1 - student2 #뺄셈
multiplication = student1 * student2 #곱셈
division = student1 / student2 #나눗셈
print(type(division))
print('\n')
# 사칙연산 결과를 데이터프레임으로 합치기 (시리즈 -> 데이터프레임)
result = pd.DataFrame([addition, subtraction, multiplication, division],
index=['덧셈', '뺄셈', '곱셈', '나눗셈'])
print(result)
NaN 값이 있는 시리즈 연산
# 라이브러리 불러오기
import pandas as pd
import numpy as np
# 딕셔너리 데이터로 판다스 시리즈 만들기
student1 = pd.Series({'국어':np.nan, '영어':80, '수학':90})
student2 = pd.Series({'수학':80, '국어':90})
print(student1)
print('\n')
print(student2)
print('\n')
# 두 학생의 과목별 점수로 사칙연산 수행 (시리즈 vs. 시리즈)
addition = student1 + student2 #덧셈
subtraction = student1 - student2 #뺄셈
multiplication = student1 * student2 #곱셈
division = student1 / student2 #나눗셈
print(type(division))
print('\n')
# 사칙연산 결과를 데이터프레임으로 합치기 (시리즈 -> 데이터프레임)
result = pd.DataFrame([addition, subtraction, multiplication, division],
index=['덧셈', '뺄셈', '곱셈', '나눗셈'])
print(result)
연산 메소드
- 연산에서 객체 사이에 공통 인덱스가 없거나 NaN이 포함된 경우 연산결과는 NaN으로 반환
- NaN이 반환되는 것을 피하려면 fill_value 옵션을 설정하여 적용
# 라이브러리 불러오기
import pandas as pd
import numpy as np
# 딕셔너리 데이터로 판다스 시리즈 만들기
student1 = pd.Series({'국어':np.nan, '영어':80, '수학':90})
student2 = pd.Series({'수학':80, '국어':90})
print(student1)
print('\n')
print(student2)
print('\n')
# 두 학생의 과목별 점수로 사칙연산 수행 (연산 메소드 사용)
sr_add = student1.add(student2, fill_value=0) #덧셈
sr_sub = student1.sub(student2, fill_value=0) #뺄셈
sr_mul = student1.mul(student2, fill_value=0) #곱셈
sr_div = student1.div(student2, fill_value=0) #나눗셈
# 사칙연산 결과를 데이터프레임으로 합치기 (시리즈 -> 데이터프레임)
result = pd.DataFrame([sr_add, sr_sub, sr_mul, sr_div],
index=['덧셈', '뺄셈', '곱셈', '나눗셈'])
print(result)
데이터프레임 연산
데이터프레임 vs 숫자
- 데이터프레임에 어떤 숫자를 더하면 모든 원소에 숫자를 더한다.
- 예제는 Seaborn 라이브러리의 데이터셋 중 타이타닉 데이터셋 활용
# 라이브러리 불러오기
import pandas as pd
import seaborn as sns
# titanic 데이터셋에서 age, fare 2개 열을 선택하여 데이터프레임 만들기
titanic = sns.load_dataset('titanic')
df = titanic.loc[:, ['age','fare']]
print(df.head()) #첫 5행만 표시
print('\n')
print(type(df))
print('\n')
# 데이터프레임에 숫자 10 더하기
addition = df + 10
print(addition.head()) #첫 5행만 표시
print('\n')
print(type(addition))
데이터프레임 vs 데이터프레임
- 각 데이터프레임의 같은 행, 같은 열 위치에 있는 원소끼리 계산
- NaN이나 원소가 존재하지 않으면 연산 결과는 NaN으로 처리
# 라이브러리 불러오기
import pandas as pd
import seaborn as sns
# titanic 데이터셋에서 age, fare 2개 열을 선택하여 데이터프레임 만들기
titanic = sns.load_dataset('titanic')
df = titanic.loc[:, ['age','fare']]
print(df.tail()) #마지막 5행을 표시
print('\n')
print(type(df))
print('\n')
# 데이터프레임에 숫자 10 더하기
addition = df + 10
print(addition.tail()) #마지막 5행을 표시
print('\n')
print(type(addition))
print('\n')
# 데이터프레임끼리 연산하기 (additon - df)
subtraction = addition - df
print(subtraction.tail()) #마지막 5행을 표시
print('\n')
print(type(subtraction))
'AI > Python Module' 카테고리의 다른 글
pip 패키지 관리자 (0) | 2022.07.18 |
---|---|
Numpy (0) | 2022.05.25 |
Python #eunjeon, mecab 모듈 설치 (0) | 2021.10.21 |
Python #KoNLPy (0) | 2021.10.19 |
PyAutoGUI #파이썬 마우스 키보드 이벤트 제어 (0) | 2021.10.17 |