예전에 R이 Python보다 인기가 많았던 이유 중에 하나는 dataframe인데 이를 파이썬이 pandas라는 이름으로 베껴옴
numpy와 pandas는 뭐가 다를까?
pandas는 numpy의 문법으로 만들어져서 numpy의 기능들이 기본적으로 pandas에 다 있다고 보면되고 거기에 추가로
등의 편리한 기능이 추가 되었다고 보면 된다
그리고 표 형식의 데이터를 numpy보다 pandas가 훨씬 잘한다
DataFrame
= 표 형식의 자료를 담는 자료형
표에서
column
은 데이터의 특징을 담고
row
는 레코드를 부름
import pandas as pd
two_dimensional_list = [['dongwook',50,86],['sineui',89,31],['ikjoong',68,91],['yoonsoo',88,75]] #2차원 배열 지정
my_df = pd.DataFrame(two_dimensional_list,columns = ['name','english_score','math_score'],index =['a','b','c','d'])
my_df
ㄴ 원래 numpy에서는 np.array()로 했지만 pandas에서는 pd.DataFrame으로 지정해준다. 행을 나타내는 columns
와 원래 열을 나타내는 row
를 쓰지 않고 pandas에서는 index
를 쓰기 때문에 각각 지정해주었다.
output
type(my_df)
my_df.columns # 행에 무슨 값들이 있는지 추출
my_df.index # 열에 무슨 값들이 있는지 추출
my_df.dtypes # 해당 열에 저장된 값들의 자료형을 추출
output
pandas.core.frame.DataFrame
Index(['name', 'english_score', 'math_score'], dtype='object')
Index(['a', 'b', 'c', 'd'], dtype='object')
name object # pandas에서는 문자열을 object라고 한다
english_score int64
math_score int64
dtype: object
2차원 리스트
나 2차원 numpy array
로 DataFrame
을 만들 수 있고 심지어 pandas Series
를 담고 있는 리스트로도 DataFrame
을 만들 수 있다
import numpy as np
import pandas as pd
two_dimensional_list = [['dongwook',50,86],['sineui',89,31],['ikjoong',68,91],['yoonsoo',88,75]]
two_dimensional_array = np.array(two_dimensional_list)
list_of_series = [
pd.Series(['dongwook',50,86]),
pd.Series(['sineui',89,31]),
pd.Series(['ikjoong',68,91]),
pd.Series(['yoonsoo',88,75])
]
df1 = pd.DataFrame(two_dimensional_list)
df2 = pd.DataFrame(two_dimensional_array)
df3 = pd.DataFrame(list_of_series)
print(df1)
output
0 1 2
0 dongwook 50 86
1 sineui 89 31
2 ikjoong 68 91
3 yoonsoo 88 75
파이썬 딕셔너리
로도 DataFrame
을 만들 수 있다. 사전의 key
로는 column의 이름
을 쓰고, 그 column
에 해당하는 리스트
, numpy array
혹은 pandas Series
를 사전의 value
로 넣어주면 된다
names = ['dongwook','sineui','ikjoong','yoonsoo']
english_scores = [50,89,68,88]
math_scores = [86,31,91,75]
dict1 = {
'name':names,
'english_score':english_scores,
'math_score':math_scores
}
dict2 = {
'name':np.array(names),
'english_score':np.array(english_scores),
'math_score':np.array(math_scores)
}
dict3 = {
'name':pd.Series(names),
'english_score':pd.Series(english_scores),
'math_score':pd.Series(math_scores)
}
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
df3 = pd.DataFrame(dict3)
print(df1)
output
name english_score math_score
0 dongwook 50 86
1 sineui 89 31
2 ikjoong 68 91
3 yoonsoo 88 75
리스트가 담긴 딕셔너리가 아니라 딕셔너리가 담긴 리스트로도 DataFrame을 만들 수 있음
my_list = [
{'name':'dongwook','english_score':50,'math_score':86},
{'name':'sineui','english_score':89,'math_score':31},
{'name':'ikjoong','english_score':68,'math_score':91},
{'name':'yoonsoo','english_score':88,'math_score':75}
]
df = pd.DataFrame(my_list)
print(df)
output
name english_score math_score
0 dongwook 50 86
1 sineui 89 31
2 ikjoong 68 91
3 yoonsoo 88 75
아래와 같은 결과가 나오도록 DataFrame을 만들고 출력해 보세요.
column은 name, birthday, occupation 총 3개입니다.
code
names = ['Taylor Swift','Aaron Sorkin','Harry Potter','Ji-Sung Park']
birthdays = ['December 13, 1989','June 9, 1961','July 31, 1980 ','February 25, 1981']
occupations = ['Singer-songwriter','Screenwriter','Wizard','Footballer']
dict1 = {
'name':names,
'birthday':birthdays,
'occupation':occupations
}
df = pd.DataFrame(dict1)
df
output
pandas DataFrame에는 다양한 종류의 데이터를 담을 수 있는데, dtypes
를 사용해서 각 column이 어떤 데이터 타입을 보관하는지 확인할 수 있다
import pandas as pd
two_dimensional_list = [['dongwook',50,86],['sineui',89,31],['ikjoong',68,91],['yoonsoo',88,75]]
my_df = pd.DataFrame(two_dimensional_list, columns = ['name','english_score','math_score'],index = ['a','b','c','d'])
print(my_df.dtypes)
output
name object
english_score int64
math_score int64
dtype: object
ㄴ 'name'
column은 object
라는 데이터 타입을, 'english_score'
와 'math_score'
column은 int64
라는 데이터타입을 보관하는 것이다 !
= 한 column 내에서는 모든 값이 동일한 데이터 타입임
pandas에 담을 수 있는 dtype 종류
csv
= 'Comma-Separated Values'의 약자로 쉼표로 구분된 값을 가지는 텍스트 파일 형식을 말함 ! (csv 파일은 간단하고 효율적인 방법으로 표 형태의 데이터를 저장하는데 사용
iphone.csv
파일을 깔아줬다
데이터를 불러오는 read_csv
를 사용해서
import pandas as pd
iphone_df = pd.read_csv('drive/MyDrive/dataScience/data/iphone.csv')
iphone_df
output
ㄴ여기서 봐야할 점은 read_csv
를 쓰면 csv파일의 첫번째 줄이 자동적으로 헤더로 들어간다는 것이당
그리고 csv 파일에서 특정 column을 row이름으로 지정이 가능한데
import pandas as pd
iphone_df = pd.read_csv('drive/MyDrive/dataScience/data/iphone.csv',index_col=0)
iphone_df
이렇게 뒤에 index_col=0
을 붙이면
0번 column이 row가 되는 것이다
데이터 타입을 알아보자면
type(iphone_df)
output
pandas.core.frame.DataFrame
이것이당
아기의 성별과 어머니의 인종에 따른, 뉴욕에서 가장 인기 있는 아기 이름이 무엇인지 조사를 해 봤습니다.
조사 결과가 data 폴더의 popular_baby_names.csv라는 파일에 담겨 있는데요. 안에 있는 정보를 DataFrame으로 읽어 들이고, DataFrame을 출력해 주세요.
code
df = pd.read_csv('drive/MyDrive/dataScience/data/popular_baby_names.csv')
df
output
‘메가밀리언’은 ‘파워볼’과 더불어 미국에서 양대산맥을 이루는 복권입니다. 당첨될 확률이 약 3억분의 1 정도로 굉장히 낮은 대신, 당첨시 금액이 어마어마하죠. 2018년에는 한 명이 무려 1.8조원을 가져가기도 했습니다.
메가밀리언 측에서 2002년부터 현재(2/15/19)까지의 당첨 번호가 담긴 mega_millions.csv 파일을 공개했는데요. 이 데이터를 DataFrame에 넣어 봅시다.
날짜(Draw Date)가 이 DataFrame의 인덱스가 되도록 해 주세요!
code
import pandas as pd
df = pd.read_csv('data/mega_millions.csv', index_col=0)
df
output