데이터분석 기초

데이터분석 기초2

토리쟁이 2022. 4. 29. 16:33

2. Pandas

구조화된 데이터를 효과적으로 처리하고 저장하는 파이썬 라이브러리

배열 계산에 특화된 Numpy를 기반으로 설계되었다.

 

Series

- numpy 배열이 보강된 형태, data와 index가 존재 ->인덱스로 접근 가능

-name 인자로 이름 지정 가능

-연산자 활용 가능

-딕셔너리를 이용하여 시리즈로 변환 가능

import numpy as np
import pandas as pd

data=pd.Series([1,2,3,4])
data=pd.Series([1,2,3,4],index=['a','b','c','d'])
print(data['b']) #2
data=pd.Series([1,2,3,4],index=['a','b','c', 'd'],name="Title")
print(data['c']) #5

population_dict={
    'korea':5180,
    'japan':12718,
    'china':141500,
    'usa':32676
}
population=pd.Series(population_dict) #딕셔너리의 key와 values가 각각 series의 인덱스와 데이터가 됨

-numpy에서 사용했던 연산자들을 동일하게 활용가능

#Series 연산
A=pd.Series([2,4,6],index=[0,1,2])
B=pd.Series([1,3,5],index=[1,2,3])
print(A+B) #데이터가 없을 경우에는 NaN으로 표시됨
print(A.add(B, fill_value=0)) #데이터가 없을 경우에는 0이라고 채우고 A와 B를 더함

 

DataFrame

-여러 개의 Series가 모여서 행과 열을 이루는 데이터

-딕셔너리를 이용하여 데이터프레임으로 변환 가능

-저장&불러오기

gdp_dict={
    'korea':169320000,
    'japan':516700000,
    'china':1409250000,
    'usa':2041280000
}
gdp=pd.Series(gdp_dict)
#데이터프레임 생성
country=pd.DataFrame({
    'population':population,
    'gdp':gdp
}) #위의 예시에서 만들어진 population series와 gdp series를 합쳐 데이터프레임 생성

gdp_per_capita=country['gdp']/country['population'] #gdp series를 population series로 나누어 새로운 gdp_per_capita series를 생성
country['gdp per capita']=gdp_per_capita #바로 위에서 만든 새로운  series를 데이터 프레임의 'gdp per capita' 칼럼에 넣음

#데이터 프레임 저장 & 불러오기
country.to_csv("./country.csv") #csv파일로 저장
country.to_excel("country.xlsx") #엑셀 파일로 저장
country=pd.read_csv() #csv파일에 있는 데이터를 불러오기
country=pd.read_excel() #엑셀 파일에 있는 데이터를 불러오기

-인덱싱/슬라이싱이 가능하다.

.loc: 명시적인 인덱스를 참조하는 인덱싱/슬라이싱

.iloc: 정수 인덱스 인덱싱/슬라이싱 (명시적으로 작성하는 것이 아닌 정수형 인덱스 사용)

country.loc['china'] #명시적으로 china를 인덱싱하여 china의 데이터를 모두 갖고옴(gdp, population, gdp per capita)
country.loc['japan':'korea', :'population'] #명시적으로 슬라이싱하여 japan부터 korea까지의 gdp부터 population까지의 데이터를 갖고 옴
country.iloc[0] #china의 데이터를 모두 갖고옴(gdp, population, gdp per capita)
country.iloc[1:3,:2] # 인덱스가 1인 japan부터 인덱스가 2인 korea까지의 gdp(인덱스0)부터 population(인덱스1)까지의 데이터를 갖고 옴

-DataFrame에 새로운 데이터 추가/수정 -> 리스트 or 딕셔너리 이용

-칼럼 선택시, 칼럼 이름이 하나만 있다면 Series/리스트로 들어가 있다면 DataFrame

#새 데이터 추가 & 수정
dataframe=pd.DataFrame(colums=['이름','나이','주소'])
dataframe.loc[0]=['임원균','26','서울']
dataframe.loc[1]=['이름':'철수','나이':'25','주소':'인천']
dataframe.loc[1,'이름']='영희' #인덱스가 1인(행이 1)데이터의 이름 데이터를 영희로 바꿈

#새로운 칼럼 추가
dataframe['전화번호']=np.nan #전화번호 칼럼 추가 (데이터 값은 존재하지 않음)
dataframe.loc[0,'전화번호']='01012341234' #인덱스가 0인 (행이 0) 임원균의 전화번호의 값을 저장
len(dataframe) #2(인덱스가 0, 1인 데이터 총 2개)

#칼럼 선택하기
dataframe["이름"] #dataframe의 0,1번 인덱스의 이름 칼럼이 선택되어 series를 이룸
dataframe[["이름","주소","나이"]] #dataframe의 0,1번 인덱스의 이름,주소,나이 칼럼이 선택되어 dataframe을 이룸

현실 데이터에는 일부가 누락되어 있는 형태의 데이터가 많다.

-누락된 데이터를 체크하거나 값을 채울 수 있다.

#누락된 데이터 체크
dataframe.isnull() #누락된 데이터가 있는가-> True/False
dataframe.notnull() #데이터가 채워졌는가-> True/False
dataframe.dropna() #결측값이 있는 행 제거 -> 인덱스가 1인 영희의 전화번호가 없으므로 1번 인덱스가 제거된 형태의 데이터프레임 출력가능 하지만, 원래의 데이터프레임은 변함이 없다

#데이터프레임의 특정 행 or 열 삭제-> .drop(['지우고자하는 인덱스나 칼럼'], axis=0/1)
dataframe=dataframe.drop([1],axis=0) #1번 인덱스의 행이 삭제됨
dataframe=dataframe.drop(['전화번호', axis=1]) #전화번호 칼럼의 열이 삭제됨

dataframe['전화번호']=dataframe['전화번호'].fillna('전화번호 없음') #전화번호 칼럼이 결측치인 경우 '전화번호 없음'을 채움

-DataFrame 연산(+,-,*,/)

#DataFrame의 연산
A=pd.DataFrame(np.random.randint(0,10,(2,2)),columns=list("AB")) #0이상 10미만의 범위에서 난수를 추출하여 컬럼이 A, B인 2*2 데이터프레임 생성
B=pd.DataFrame(np.random.randint(0,10,(3,3)),columns=list("BAC"))#0이상 10미만의 범위에서 난수를 추출하여 컬럼이 B,A,C인 3*3 데이터프레임 생성
print(A+B) #더할 때, 하나의 데이터라도 없을 경우 해당 데이터는 NaN -> 따라서, C열의 모든 데이터가 NaN으로 출력됨
print(A.add(B,fill_value=0))  #데이터가 없을 경우에는 0이라고 채우고 A와 B를 더함

-집계함수 사용 가능

#집계함수 사용
data={
    'A':[i+5 for i in range(3)],
    'B':[i**2 for i in range(3)]
} #딕셔너리 생성
df=pd.DataFrame(data) #딕셔너리를 이용하여 데이터프레임 생성
print(df['A'].sum()) #A행의 데이터를 모두 더한 값 출력 18
print(df.sum()) #데이터프레임의 각 행의 데이터를 모두 더한 값을 각각 출력
print(df.mean) #데이터프레임의 각 행의 데이터의 평균을 각각 출력

-정렬

.sort_values()를 사용하여 정렬 ->인덱스 순서대로 정렬됨

.sort_values('col1')를 사용하여 정렬 ->'col1'칼럼의 데이터 값이 오름차순으로 정렬됨

.sort_values('col1',ascending=False)를 사용하여 정렬 ->'col1'칼럼의 데이터 값이 내림차순으로 정렬됨

.sort_values(['col2','col1'])를 사용하여 정렬 ->'col2'칼럼의 데이터 값이 오름차순으로 정렬된 상태에서 'col1'칼럼의 데이터 값이 오름차순으로 정렬됨

.sort_values(['col2','col1'],[ascending=True, ascending=False])를 사용하여 정렬 ->'col2'칼럼의 데이터 값이 오름차순으로 정렬된 상태에서 'col1'칼럼의 데이터 값이 내림차순으로 정렬됨

#정렬
df.sort_values() #인덱스 순서대로 정렬됨
df.sort_values('col1') #'col1'칼럼의 데이터 값이 오름차순으로 정렬됨
df.sort_values('col1',ascending=False) #'col1'칼럼의 데이터 값이 내림차순으로 정렬됨
df.sort_values(['col2','col1']) #'col2'칼럼의 데이터 값이 오름차순으로 정렬된 상태에서 'col1'칼럼의 데이터 값이 오름차순으로 정렬됨
df.sort_values(['col2','col1'],ascending=[True,False]) #'col2'칼럼의 데이터 값이 오름차순으로 정렬된 상태에서 'col1'칼럼의 데이터 값이 내림차순으로 정렬됨