euny!
errorlog
euny!
전체 방문자
오늘
어제
  • 분류 전체보기 (22)
    • Python (13)
    • 데이터분석 (3)
    • WIL (4)
    • SQL (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅗ
  • BeautifulSoup
  • 크롤링
  • 웹크롤링
  • 웹스크래핑
  • SQL

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
euny!

errorlog

[WIL] Pandas 기초, 데이터 수집하기
WIL

[WIL] Pandas 기초, 데이터 수집하기

2023. 1. 12. 16:43

[2023.01.09 ~ 2023.01.12]

Pandas

- 데이터 처리와 분석을 위한 라이브러리

- 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있다

- 대용량이 데이터들을 처리하는데 매우 편리하다

 

Series

- 모든 유형의 데이터를 보유하는 1차원 배열의 데이터 구조

- 테이블의 열과 같다

 

생성하기

 - 인덱스를 직접 입력하고 생성하지 않는다면 기본적으로 0, 1, 2 등의 숫자로 인덱스가 설정된다

price = pd.Series([1000, 2000, 3000, 4000])

- 인덱스를 지정하여 생성한 결과

price = pd.Series([1000, 2000, 3000, 4000], index=[100, 200, 300, 400])

접근하기

- 인덱스와 value 값에 접근하기

# index 출력하기
for idx in price.index:
    print(idx)

# 값 출력하기
for value in price.values:
    print(value)

 

DataFrame

- 2차원 배열 또는 행과 열이 있는 테이블과 같은 2차원 데이터 구조

- 전체 테이블과 같다

 

생성하기

df["메뉴명"] = ["떡볶이", "우동", "김밥", "라면", "만두"]

# 새로운 컬럼 추가하기
df["가격"] = 4000

# 컬럼 값 변경하기
price = [3500, 3200, np.nan, 4000, 5000]
df["가격"] = price

Nan = Not a Number (결측치를 의미하며 데이터 타입은 float이다)

 

삭제하기

df.drop() : axis가 1일때는 컬럼, 0일때는 행을 의미한다.

df["분야"] = "분식"
df = df.drop("분야", axis=1)

정보확인하기

df.info() : 데이터프레임의 정보 확인한다

df.info()

>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   메뉴명     5 non-null      object 
 1   가격      4 non-null      float64
dtypes: float64(1), object(1)
memory usage: 208.0+ bytes

df.shape : 데이터프레임의 크기를 출력한다 ( 행, 열)

df.shape

>>
(5, 2)

df.dtypes : 데이터의 타입을 확인한다.

dt.dtypes

>>
메뉴명     object
가격     float64
dtype: object

df.describe() : 데이터프레임의 요약정보를 가져온다.

괄호안에 아무것도 지정해주지 않았을땐 수치형 데이터의 기술통계값을 가져온다.

count : 결측치를 제외한 빈도수

mean : 평균값

std :  표준편차

min : 최솟값

25%, 50%, 75% : 값을 순차정렬했을 때 앞에서부터 25, 50, 70% 위치에 있는 값

max : 최댓값

df.describe()

특정 데이터를 지정하여 범주형 데이터의 기술통계 값을 가져온다

count : 결측치를 제외한 빈도수

unique : 유일값

top : 최빈값

freq : 최빈값의 빈도수

df.describe(include = "object")
df.describe(include = "O")
df.describe(exclude="number")

값 가져오기

- loc : index 및 column 이름을 통해 지정하는 방법

- iloc : index를 활용하여 지정하는 방법

 

한눈에 비교하기

loc 사용

- 인덱스 이름이 3인 '라면' 데이터까지 나오게 된다

df.loc[:3]

iloc 사용

- 인덱스가 3보다 작은 데이터까지 나오게 된다

df.iloc[:3]

특정 문자가 포함된 데이터만 가져오기

df["메뉴명"].str.contains("떡")

>>
0     True
1    False
2    False
3    False
4    False
Name: 메뉴명, dtype: bool

특정 조건을 만족하는 데이터프레임 가져오기

df[df["가격"] > 3500]

데이터 정렬하기

df.sort_values(by=["메뉴명", "가격"], ascending=[False, True])

데이터 일부만 보기

- 괄호 내에 숫자를 지정해주지 않으면 5개가 default

# 앞에서부터 5개 노출
df.head()

# 뒤에서부터 5개 노출
df.tail()

데이터 합치기

- axis = 0 : 행을 기준으로 위아래 같은 컬럼끼리 값을 이어 붙여 새로운 행을 만든다

- axis = 1 : 컬럼을 기준으로 인덱스가 같은 값을 옆으로 이어 붙여 새로운 컬럼을 만든다

pd.concat(list)

결측치 제거하기

df.dropna()

중복값 제거하기

df.drop_duplicates()

데이터 수집하기

pd.read_html()

- URL, HTML 소스코드를 넣어주게 되면 테이블 태그를 찾아서 반환합니다.
- URL 을 넣어주면 특정 URL 에 접근해서 HTML 페이지의 table 태그를 읽어옵니다.
- HTML 페이지의 table 태그는 <table></table> 로 구성이 됩니다.
- 해당 HTML 의 모든 table을 가져와서 리스트 형태로 반환됩니다.
- 반환된 리스트를 인덱싱하게 되면 데이터프레임으로 되어 있습니다.
table = pd.read_html(url, encoding="cp949")
 
로봇의 접근을 막아놓는 페이지의 경우에는 위의 방법으로 바로 URL로 접근하여 데이터를 수집할 수 없다.
 
header에 유저정보를 입력하여 requests 요청을 하여 응답값을 가져온 후 데이터 수집을 하여야한다!

requests

- get : 데이터를 Query String에 담아서 전송한다

- post : 데이터를 http 메세지의 body의 form data에 담아서 전송한다

 

?? post 방식과 get 방식중에 무엇으로 보내야 할지 모르겠다면

수집할 페이지를 연 후 개발자도구를 열어 network 탭의 headers를 확인한다

 

import requests

headers = {"user-agent": "Mozilla/5.0"}
print(headers["user-agent"])
response = requests.get(url, headers=headers)

table = pd.read_html(response.text)
 
 
requests 요청시 아래와 같이 SSL 인증서 오류가 발생하는 경우가 있다

인증서가 없는 사이트를 접속할 때 나타나는 에러이다.

verufy = False 를 통해 SSL 인증서 확인 과정을 생략한다.

response = requests.post(url, params = params, verify = False)

경고메세지는 없어지지 않고 나오게 되는데 경고메세지 조차 보기 싫다면 아래와 같이 코드를 추가한다.

equests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)

 

 

 


[이번주 회고]

본격적으로 pandas를 이용하여 데이터 수집하는 방법을 배우는 주였다.

다행히 첫주차에 크롤링강의를 들어서 이번주에 강사님이 이야기 하시는 내용을 잘 따라할 수 있었던 것 같다.

계속해서 비슷한 코드를 작성하여 데이터 수집을 하는데, 조금씩 익숙해지는 것 같아 다행이다.

과제를 하다가 오류가 나서 에러메세지를 찾아보고 해결해보며 조금씩 느는것 같기도?!

 

'WIL' 카테고리의 다른 글

[WIL] 한주동안의 강의 요약, 버거지수  (0) 2023.02.09
[WIL] Matplotlib  (0) 2023.02.02
[WIL] Jupyter Notebook 사용하기, Pandas  (0) 2023.01.19
    'WIL' 카테고리의 다른 글
    • [WIL] 한주동안의 강의 요약, 버거지수
    • [WIL] Matplotlib
    • [WIL] Jupyter Notebook 사용하기, Pandas
    euny!
    euny!

    티스토리툴바