Pandas
온전히 통계 분석을 위해 고안된 R 과는 다르게 python은 일반적인 프로그래밍 언어(general purpose programming language) 이며, 데이터 분석을 하기 위해서는 여러가지 라이브러리를 사용할 수 밖에 없다. 이 패키지들 중 R의 dataframe 데이터 타입을 참고하여 만든 것이 바로 pandas dataframe이다. pandas는 dataframe을 주로 다루기 위한 라이브러리이며, dataframe을 자유롭게 가공하는 것은 데이터 과학자들에게 중요하다.(출처)
모양은 엑셀 시트를 하나의 데이터 타입으로 만들어 놓은 듯 하다. 행과 열로 이루어져 있어, 테이블의 형식으로 볼 수 있다.
DataFrame
Series들의 집합.
여러개의 Series(행)이 모여 하나의 테이블형식의 데이터를 생성할 수 있다.
행과 열이 있는 table 형태를 가진다.
Series
DataFrame의 한 컬럼 데이터세트.
Series 역시 DataFrame의 인덱스와 동일한 인덱스를 가진다.
Series는 테이블 형식의 데이터로 봤을때 하나의 레코드 즉, 행 값으로 생각하면 된다.
=> 즉, Series는 컬럼이 하나인 데이터 구조체이고, DataFrame은 컬럼이 여러개인 데이터 구조체이다.
▼전체 코드 보기
-jupyter notebook
from IPython.core.display import display, HTML
display(HTML("<style> .container{width:90% !important;}</style>"))
이 jupyter는 'heannim-world.tistory.com'에서 가져왔습니다. 퍼가실 때 출처표시와 댓글 남겨주세요.¶
----------------------- pandas 기초 ---------------------------¶
Series는 어떻게 생겼나?
#기본 수입
import pandas as pd
#Series는 Dataframe의 하나의 열이다.
age_in = pd.Series([22,23,44,55,28])
age_in
리스트는 딕셔너리와 달리 key값이 없는 순서형 자료형이므로, 인덱스는 자동으로 0부터 부여된다.
1) index, keys, values¶
#인덱스를 접근하는 방법(아주 중요!!구글링해도 안나옴....)
#rangeIndex : 기본 인덱스 범위가 안정해졌을때 알아서 지정해준 그 인덱스의 범위를 표시해준다.
age_in.index
#값을 나타내는 방법
age_in.values
# 키 함수(=index와 같다)
age_in.keys()
#Series.index와 같이 인덱스가 가지고 있는 key값을 반환
print(age_in.keys)
컬럼(세로) 부여하기¶
#시리즈 생성하기
age_in = pd.Series([22,33,44,55,28], index = ['가','나','다','라','마'])
age_in
#index를 사용해서 Series에 접근할 수 있다.
age_in['다']=100 #'다' 값 바꾸기
age_in
아래 둘이 의미하는 바가 같다.
#인덱스 보여줘
age_in.keys()
#인덱스 보여줘
age_in.index
dataframe만들기¶
srs = pd.Series(['가','나','다'], index = ['a','b','a'])
srs
#인덱스 보여줘
print(srs.index)
#인덱스 보여줘
print(srs.keys())
# 키에 따른 값까지 반환
print(srs.keys)
#index 번호로 출력하기
print(srs[0])
print(srs[1])
print(srs[2])
#-1은 맨 끝에를 의미한다.
print(srs[-1])
#데이터프레임 생성
df = pd.DataFrame(
[
[1,2,3],
[4,5,6],
[7,8,9]
],
)
df
#시리즈 생성(모양을 비교해보자.)
ss = pd.Series([1,2,3,4,5,6])
ss
Series는 dataframe의 한 열이다.
2) array, type¶
numpy의 Array를 사용해서 시리즈로 생성하기¶
#11,22,33의 값을 numpy로 생성해서 시리즈로 대입해보기
listv = [11,22,33]
s1 = pd.Series(listv)
s1
이걸 numpy array로 바꾸면?
# numpy array는 Series의 값으로 대입
import numpy as np
n1 = np.array(listv)
n1
#array와 list의 차이(쉼표)
print(listv)
print(n1)
#각각의 type은?
print(type(listv))
print(type(n1)) #numpy에서 제공하는 array 타입이다.
3) dictionary¶
딕셔너리를 시리즈 형태로 변환(중요)¶
info_list = {'kim' : 25, 'park' : 22, 'lee' : 34} #json 형태
info_series = pd.Series(info_list)
info_series
제이슨 형태를 list로 받아올 수 있음.
# 딕셔너리의 키값이 시리즈의 인덱스값이 된다.
info_series.index
# 값들
info_series.values
# 키값으로 변환
info_series['lee'] = 100
print(info_series)
#딕셔너리일 경우, 키값이 시리즈의 인덱스로 설정되어 있기 때문에
#시리즈를 생성할 때 새로운 인덱스를 부여하면
#그 인덱스에 새로운 키로 생성 ->NaN
info_series = pd.Series(info_list, index=[0,1,2])
info_series
즉, 원래 있던 값이 아닌 앞에꺼가 지워지고 같은 이름의 새로운게 만들어지고, 거기에 값을 부여하지 않는 형태가 됨
# 다시 원래대로 값 넣고
info_series = pd.Series(info_list)
info_series
#인덱스 변경
info_series.index = ['A','B','C']
info_series
4) tuple¶
튜플 : 같은 값의 index가 가능하다.(중복가능)¶
#튜플은 둥근괄호
mytuple = (10,20,30)
mytuple
#시리즈로 만들기
my_s = pd.Series(mytuple)
my_s
#인덱스 부여하기
my_s = pd.Series(mytuple, index=['A','B','C'])
my_s
5) mean¶
pandas를 사용해야 하는 이유¶
odd = [1, 3, 5, 7, 9]
type(odd) #타입?
#평균 구하기
np.mean(odd)
numpy에서 평균을 구하는 수식을 지원한다. 이걸 시리즈에 담아서도 할 수 있다!
odd2 = pd.Series(odd)
odd2
odd2.mean()
import numpy as np
import pandas as pd
#딕셔너리 만들기
dicts = {
"a" : [5,6,7], #이거 한줄이 시리즈가 될 수 있다.
"b" : [8,9,10],
"c" : ['2018','2019','2020'],
"d" : [1.,2.,3.] #소수점 표시하면 뒤에 0이 붙는다.
}
dicts
#데이터 프레임 생성
df = pd.DataFrame(dicts,index=[1,2,3])
df
6) dtypes¶
#각각의 타입을 보면
df.dtypes
각각 숫자, c는 object(정수,실수, 문자형 등등을 전부 포함하는 가장 상위 자료형), d는 실수형이다.
#print 하면 약간 형태가 다르다.
print(df)
아무것도 안하고 출력하면 알아서 파이썬이 이쁘게 표로 나타내준다. print는 말 그대로 출력만
#이 데이터프레임의 정보를 보자.
#인덱스3개, 항목 1~3, 총 4개의 컬럼과 빈값 없음. type에서 보았던 자료형들까지.
df.info()
#컬럼명으로 출력해보자.
print(df.a)
print(df.c)
#컬럼명을 문자열로(배열의 한 문자열로) 출력
print(df['a'])
#인덱스 자체를 리스트로 부여해서 가져오자
idx_list=["a","b"]
df[idx_list]
idx_list=["a","b","c","d"]
df[idx_list]
#컬럼으로 배열 형태로 가져오자
column = ["a","b","c"]
#값들도 2차원 데이터(행렬데이터)로 Dataframe 생성해서 가져오자.(배열 속 배열 : 2차원 배열)
cc = [[5,6,7],[8,9,10],['2018','2019','2020']]
# cc를 데이터 프레임으로 만든걸 df_c에 저장
df_c = pd.DataFrame(cc)
df_c
#인덱스(세로 : 가로줄 하나하나를 묶음)와 컬럼(가로 : 세로줄 하나하나를 묶음)도 부여해주자
df_c = pd.DataFrame(cc, index=[1,2,3], columns=column)
df_c
------------ 헷갈리는 것 : index와 column ----------------¶
7) arrange, reshape¶
numpy를 이용해서 변수값을 선언한 후에 데이터프레임으로 변경해서 같은 결과가 나오도록 구현해보기¶
import numpy as np
#arrage : 범위 안 정수 출력 (5부터 14까지)
a = np.arange(5,14)
a
#reshape : 배열로 3x3 모양을 만든다.
b = np.array(a).reshape(3,3)
b
df = pd.DataFrame(b, index=[1,2,3], columns=["a","b","c"])
df
reshape()는 다차원으로 변형이 가능하다. 괄호에 3x3 형태로 하겠다는 표시를 남기자
8) 비교연산자¶
dataframe은 비교연산자 사용 가능하다.¶
df
a
df.a #a행
# df.a의 값이 특정 기준 8 인 데이터 프레임 가져오기(행)
print(df[df.a == 8])
# 8이 아닌것
print(df[df.a != 8])
b
df.b
#df.b 칼럼에서 10보다 큰 값을 가져오기(행)
print(df[df.b > 10])
# 없으면 그냥 확인만
df.b > 10
#df.b 칼럼에서 10보다 큰 값을 가져오기(행)
if df[df.b > 20].empty:
print("20이상 값 없음")
#b열이 8보다 큰 경우만 뽑아줘
df[df['b']>8]
9) items(), generator¶
# 키-값 쌍을 한 꺼번에 뽑아 내는 함수. generator 형식으로 뽑힌다.
df.items()
반복문으로 items의 모든 값을 출력해보자
#column을 기준으로 Series의 values를 반환한다.
for label , content in df.items():
print('label:',label)
print('*'*10)
print('content:')
print(content)
for label , content in df.items():
print(label)
print(content)
10) drop_duplicates, shape, ndim¶
데이터 전처리(중복, null,NaN 등)¶
data = {
'name' : ['홍길동','이철수','김영희','박민수','이철호','김영희'],
'year' : [2014,2015,2016,2017,2018,2016],
'point' : [1.5,1.7,3.9,2.4,2.9,3.9]
}
data
df = pd.DataFrame(data)
df
#중복데이터 처리 (실제로는 사라지지 않음. 보여지기만 하는것.)
df.drop_duplicates()
#id로 확인해보면
id(df)
id(df.drop_duplicates())
둘이 값이 다르다.
이걸 바로 적용한다면?¶
#방법1. df 초기화(덮어쓰기)
df = df.drop_duplicates()
df
#방법2. 간지나게 속성부여해주기
df.drop_duplicates(inplace=True)
df
# 데이터프레임에서의 값(내용) 출력
df.values
#데이터프레임 크기 -> 5x3 형태를 띈다.
df.shape
#차원 출력하기 -> 2차원이라고 한다.
df.ndim
겹치는 '김영희'를 빼고 새로운 데이터셋 생성¶
data = {
'name' : ['홍길동','이철수','김영희','박민수','이철호'],
'year' : [2014,2015,2016,2017,2018],
'point' : [1.5,1.7,3.9,2.4,2.9]
}
data
#없는 column을 추가하면?
df = pd.DataFrame(data,columns=['year','name','point','penalty'],
index = ['one','two','three','four','five'])
df
딕셔너리를 데이터프레임의 값으로 처리할 때 키값이 다를 경우, 또는 새로운 칼럼을 추가할 경우 그 값은 NaN 으로 처리된다.
#index 보기
df.index
# index와 column을 제외한 값들 보기
df.values
# NaN 값 통일해서 채워넣기
df.penalty = 0.7
df
#옆에 칼럼 값의 데이터로 각각 연산할 수도 있다.
df['penalty'] = df['point'] -1.0 #패널티는 포인트에서 1을 뺀 것.
df
#외부에서 리스트로 데이터 값 변경
df['penalty'] = [0.5,0.7,0.9,1.0,0.6]
df
#새로운 컬럼의 데이터 추가
df['age'] = [10,20,30,24,15]
df
연습문제 1 : 급여를 ( 평균나이 x 100000(십만) * penalty ) 로 연산해서 pay란 컬럼으로 생성하시오.¶
penalty = np.mean(df['age'])
df['pay'] = df['age'] * 100000 * penalty
df
연습문제2 : age 컬럼에서 나이가 19세 이상이면 성년 , 이하이면 미성년으로 구분해서 df['division'] 이란 컬럼으로 저장하시오.¶
dv = []
for a in df['age']:
if a >=19:
dv.append("성년")
else:
dv.append("미성년")
print(dv)
df['division'] = dv
df
11) del, loc, iloc¶
# 컬럼 삭제 : del
del df['age']
del df['division']
df
# loc : 레이블을 기반으로 인덱싱
# 특정 행을 출력, loc[행범위, 열범위]
df.loc
#two에 해당하는 행을 출력한다.
df.loc["two"]
#two~four 구간 출력
df.loc["two":"four"]
#전체구간에서 year와 name만 꺼내오기
df.loc[:,['year','name']]
df
#정수기반으로 위치(인덱스번호)를 인덱싱
#0부터 3번째
df.iloc[3]
# df.iloc[행범위, 열범위] start:end => end는 -1 한 곳까지다.
df.iloc[3:5,0:2]
# 전체 행에서 1~3열을 출력 => iloc 사용
df.iloc[:,1:4]
#특정값을 찾을 때(인덱스번호로 0부터 1,1자리)
df.iloc[1,1]
jupyter notebook-
'[ Python ]' 카테고리의 다른 글
[Python] Pandas 기초 / groupby / 데이터프레임 Json으로 저장 / 실습(3) (0) | 2020.10.30 |
---|---|
[Python] Pandas 기초 / DataFrame / matplotlib / 실습(2) (0) | 2020.10.29 |
[python] 주피터 노트북(jupyter notebook) 단축키 (0) | 2020.10.28 |
[Python] Pandas 기초/ Series /DataFrame / 실습(1) (0) | 2020.10.28 |
[Python] pandas 기초(3) - 문제풀이 (0) | 2020.10.28 |
댓글