수업 복습/크롤링과 데이터분석
판다스
김복칠
2024. 4. 1. 16:04
1. 판다스
- '웨스 맥키니'가 개발한 라이브러리
- 데이터 작어블 쉽고 직관적으로 할 수 있도록 설계된 빠르고 유연한 자료구조(데이터 프레임)를 제공하는 모듈
!pip install pandas
import pandas as pd
- 판다스를 install 하고 import를 통해서 pd로 바꾸어 줍니다
1-1. Series와 DataFrame
- 1차원 표데이터는 시리즈, 2차원 표데이터는 데이터 프레임
- 표의 데이터 부분을 values라고 부름
- 표의 행 이름을 index라고 부름
- 표의 열 이름을 columns라고 부름
- 시리즈는 index, valuese로 이루어져 있고, 데이터 프레임은 index, columns, values로 이루어져 있음
- 시리즈와 데이터 프레임의 value는 넘파이의 ndarray 기반
data1= [[67,93,91],[75,69,96],[75,81,82],[62,72,75],[98,45,87]]
idx1 = ['김사과','반하나','오렌지','이메론','배애리']
col1 = ['국어','영어','수학']
# DataFrame(데이터, 인덱스, 컬럼 ... )
pd.DataFrame(data1)
- 데이터 프레임에 넣을 임이의 데이터를 리스트 형식으로 만들어줍니다
- 그리고 데이터를 넣어줄 인덱스와 컬럼도 리스트 형식으로 만들어줍니다
- 먼저 데이터만 DataFrame 함수를 적용시켜서 확인해 줍니다
df1 = pd.DataFrame(data=data1, index=idx1, columns=col1)
df1
- 이번에는 만들어준 데이터와 인덱스, 컬럼까지 같이 넣어줍니다
- 그리고 변수 df1을 만들어 넣어준 뒤 올바르게 출력되는지 확인해 줍니다
- DataFrame 함수에 넣어주는 순서는 구성은 데이터, 인덱스, 컬럼 순입니다
# 딕셔너리를 사용하여 데이터프레임을 생성
dic1 = {
'국어':[67,75,75,62,98],
'영어':[93,69,81,72,45],
'수학':[91,96,82,75,87]
}
df2 = pd.DataFrame(data=dic1,index=idx1)
df2
- 위에서 만들었던 데이터를 딕셔너리 형태로 바꿔서 DataFrame으로 만들어 보겠습니다
- columns에 데이터를 리스트 형태로 넣어 딕셔너리를 만들어줍니다
- 그리고 DataFrame 함수에 적용해서 동일한 데이터 프레임 표가 나오는걸 확인해 줍니다
2. 엑셀파일 읽어오기
- 엑셀로 구성된 파일을 불러오는 방법은 다음과 같습니다
pd.read_excel('/content/drive/MyDrive/데이터 분석/데이터/naver_finance.xlsx')
3. CSV 파일 읽어오기
- csv(CommaSeparated Value)의 약자로 데이터를 쉼표로 구분한 파일
- 엑셀로 로딩할 수 있지만 쉼표로 구분된 csv가 더 가볍기 때문에 데이터로 많이 사용
- csv로 구성된 파일을 불러오는 방법은 다음과 같습니다
pd.read_csv('/content/drive/MyDrive/데이터 분석/데이터/korean-idol.csv')
4. 데이터프레임 기본정보 알아보기
- 데이터프레임의 구성을 확인하는 방법으로는 아래와 같은 방법들이 있습니다
- 이와 같은 방법으로 데이터의 형태를 확인하고 필요로 하는 부분을 설정해서 활용할 수 있습니다
# 데이터프레임 형태로 데이터 불러오기
df = pd.read_csv('http://bit.ly/ds-korean-idol')
# 컬럼명 변경
new_column = ['name','group','company','gender','birthday','height','blood','brand']
df.columns = new_column
# describe() : 통계 정보를 반환
df.describe() # % 는 데이터 총합의 비율에 해당하는 값을 보유하고 있는 위치를 찍음
# shape : 형태
df.shape
# 원하는 개수의 데이터 보기
df.head() # 기본적으로 상위 다섯개의 데이터를 출력(row)
df.tail() # 기본적으로 하위 다섯개의 데이터를 출력(row)
# 정렬하기
df.sort_index() # index로 오름차순 정렬 : 기본값
df.sort_index(ascending=False) # index로 내림차순 정렬
df.sort_values(by='height') # 값에 따른 오름차순 정렬
df.sort_values(by='height', ascending=False) # 값에 따른 내림차순 정렬
df.sort_values(by='height',na_position='first') # NaN을 가장 위로 올림(기본값은 last)
5. 데이터 다루기 - 결측값(Null, NaN)
- 비어있는 값, 즉 결측값이라고 부름
- 판다스에서는 NaN(Not a Number)로 표기 된 것은 모두 결측값으로 취급
- 데이터는 불린 형태로 출력
# 'group' 에서 null 확인하기
df['group'].isna()
# df 안에 있는 'group' 에서 null 확인하기
df[df['group'].isna()]
# df 안에 있는 'group' 에서 null 이 아닌 데이터 확인하기
df[df['group'].notnull()]
6. 데이터 다루기 - 행, 열 추가 및 삭제하기
- 행을 추가할 때 dict 형태의 데이터를 만들오 append() 함수를 사용하여 데이터를 추가
- ignore_index = True 옵션을 추가해야 에러가 발생하지 않음
# 임의의 딕셔너리 생성
dic1 = {
'name' : '김사과',
'group':'과수원',
'company':'apple',
'gender':'여자',
'birthday':'2000-01-01',
'height':160,
'blood':'A',
'brand':12345678
}
# 딕셔너리를 데이터 프레임 형태로 변환
df=df.append(dic1, ignore_index=True)
# 열 추가하기
df['nation']='대한민국'
df.tail()
7. 데이터 다루기 - 통계 함수
df['height'].sum() # 합계
df['height'].count() # NaN를 포함하지 않음
df['height'].mean() # 평균
df['height'].median() # 중앙값
df['height'].max() # 최대값
df['height'].min() # 최소값
df['height'].std() # 표준편차 : 분산에 루트를 씌움
df['height'].var() # 분산 : 데이터가 평균으로부터 얼마나 떨어져 있는지 정도
# (데이터 - 평균) ** 2 을 모두 더한 값 / 데이터의 갯수
8. 중복값 제거하기
# drop_duplicates() : 중복된 데이터를 제거
# keep='first' 가 기본으로 적용되며 last 로 설정할 경우 뒤에 위치한 중복데이터를 남김
df['blood'].drop_duplicates()
# value_counts() : 열의 각 값에 대한 데이터의 개수를 반환. NaN은 생략
df['group'].value_counts()
# NaN 표기
df['group'].value_counts(dropna=False) # NaN 표기
9. 원 핫 인코딩(One Hot Encoding)
- 원 핫 인코딩은 한개의 요소는 1이고 나머지 요소는 0으로 만들어 카테고리형을 표현하는 방법
- 예) df['혈액형']을 머신러닝/딥러닝 알고리즘에 넣어 데이터를 예측하려고 하면 컴퓨터는 값들간의 관계를 스스로 형성하게 됨 -> B형은 1, AB형은 2라는 값을 가지고 있을 때 컴퓨터는 'B형 + AB형 = O형' 라는 이상한 관계를 맺을 수도 있음 -> 별도의 column들은 형성해주고 1개의 column에는 1, 나머지 column에는 0으로 넣어줌으로 'A,B,AB,O 형의 관계는 서로 독립적이다' 라는 카테고리로 표현해주는 방식을 사용
blood_map = {'A':0,'B':1, 'AB':2, 'O':3}
df['혈액형_code'] = df['혈액형'].map(blood_map) # 라벨 인코딩
df.head()
# 위에서 적용한 라벨 인코딩을 데이터 프레임에 적용해서 원 핫 인코딩으로 변환
df = pd.get_dummies(df, columns=['혈액형_code'])
df