[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 을 넣어주면 특정 URL 에 접근해서 HTML 페이지의 table 태그를 읽어옵니다.
- HTML 페이지의 table 태그는 <table></table> 로 구성이 됩니다.
- 해당 HTML 의 모든 table을 가져와서 리스트 형태로 반환됩니다.
- 반환된 리스트를 인덱싱하게 되면 데이터프레임으로 되어 있습니다.
table = pd.read_html(url, encoding="cp949")
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)

인증서가 없는 사이트를 접속할 때 나타나는 에러이다.
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 |