본문 바로가기
IT & 개발공부/파이썬(Python)

Pandas 기초 개념 공부

by 규딩코딩 2023. 8. 9.
selenium
webdriver-manager
numpy
pandas
scikit-learn
matplotlib
seaborn
plotly
jupyterlab
requests
beautifulsoup4
lxml
scrapy
scipy
statsmodels

0. 준비하기

- 이번 Pandas 실습은 jupyter lab 환경에서 이루어졌으며, 해당 가상환경에는 위와 같이 라이브러리가 설치되어있다.

 

1. 파일 입/출력

1- 1 현재 위치 찾기

- 아래 코드로 현재 폴더 위치 경로를 알아낼 수 있으며, 

import os
os.getcwd()

 

1-2 파일 저장

- 아래 코드로 데이터프레임을 만들어 원하는 경로에 test.csv 파일로 저장할 수 있다.

import pandas as pd

sample_df = pd.DataFrame({"col1" : [1,2], "col2" : [3,4]})
sample_df.to_csv("output\\sample\\test.csv",index=False, encoding='utf-8')

 

1-3 파일 불러오기

- 아래 코드로 저장한 csv 파일을 불러올 수도 있다.

df = pd.read_csv('./output/sample/test.csv')
df

 

2. 열 및 행 선택 (출처 : https://github.com/pandas-dev)

 

- 다음과 같은 코드로 원하는 열만 데이터프레임으로 가져올 수도 있고, 

 

- 조건에 맞는 데이터만을 추출할 수도 있으며,

* reset_index는 기존 데이터프레임의 인덱스 번호를 초기화하고 새로 지정한다는 코드

 

- 여러 조건을 지정하여 가져오는 것도 가능하다.

 

3. iloc 와 loc 문법

iloc[]: 이 방법은 주로 숫자 위치(인덱스)를 기반으로 한다. 즉, 행과 열을 0부터 시작하는 정수 위치로 선택

.loc[]: 이 방법은 주로 라벨(인덱스 또는 컬럼 이름)을 기반으로 한다. 이 방법은 주로 라벨을 사용하기 때문에 행 또는 열의 이름을 알고 있을 때 유용함.

- 코드 문법은 다음과 같으며, 둘의 큰 차이 중 하나가 iloc는 미만/ loc는 이하인 속성을 가지고 있다는 점이다.

 

- 또한, loc는 조건을 이용할 수 있지만, iloc는 조건을 직접 적용하는 것은 불가능하다는 차이도 있다.

 

4. 결측치

4-1. 결측치를 가진 데이터프레임 만들기

- 먼저 random.seed 메서드를 이요하여 랜덤 array를 생성해주고, 적당한 조건을 적용하여 결측치를 가진 array를 만들어준다.

 

 

- 다음으로 해당 array를 DataFrame 으로 만들어 다음의 코드를 통해 아래와 같은 정보를 살펴보도록 하자.

 

4-2 평균으로 결측치 대치해보기

- 바로 위에서 column 별 mean 값이 보일 것이다. 다음의 코드를 통해 column 의 결측치들을 mean값으로 대치해보자.

 

5. 데이터프레임 행추가

- 다음과 같은 데이터프레임을 만들어 실습해보자.

 

- 다음과 같이 특정 행을 지정하여 새로운 행에 value들을 집어넣어 행추가를 할 수 있다.

 

5.5 데이터프레임에 기존 데이터들을 이용하여 조건을 만들고, 그 조건에 따른 결과값을 새로운 열(시리즈)로 추가해보자.

- 바로 위의 데이터프레임을 활용해보겠다. # 국어점수 90점 이상  A, 80~89 B, 70~79 C, 나머지 F인 조건이다.

* np.where(조건식, 참, np.where(조건식, 참, (np.where(조건식, 참))))
* np.select(다중조건식, 다중결괏값, default ==> else 조건)

 

6. 날짜 데이터 핸들링(시계열 데이터)

6-1 데이터 가져오기

- 먼저 다음과 같이 datesold 데이터를 datetime type으로 변환해주어야 한다.

 

* pd.to_datetime은 판다스(Pandas) 라이브러리에서 제공하는 함수로, 날짜와 시간 데이터를 파싱하여 Datetime 형식으로 변환하는 데 사용한다. 이 함수는 문자열 형식의 날짜와 시간 데이터를 판다스의 Datetime 형식으로 변환하여 데이터프레임의 열에 저장하거나 시계열 데이터를 다룰 때 유용하게 활용된다.

 

6-2 시계열 데이터 활용

- 이전에서 datetime type으로 바꿔준 덕분에 dt의 메서드를 사용할 수 있게 되었고, dt.year/month/day는 각 시계열 데이터에서 연/월/일을 추출하는 dt의 메서드이다.

 

7. shift 기능(전일 대비 비교 등 비교를 위한 행 맞춤 과정)

- 먼저 기존 sales 데이터프레임 복사본을 만들고 실습을 준비하자.

* .copy() 메서드는 파이썬의 판다스 라이브러리에서 사용되는 메서드로, 데이터 구조를 복사하는 데 사용함.

이 메서드를 사용하면 원본 데이터를 변경하지 않고 복사본을 만들 수 있어서, 주로 데이터프레임이나 시리즈를 복사하거나 조작할 때 활용함.

 

-  .shift() 메서드는 판다스 라이브러리에서 사용되는 메서드로, 데이터를 주어진 개수만큼 이동시키는 데 사용된다. 이 메서드를 활용하면 시계열 데이터에서 이전 또는 다음 값과의 비교를 통해 변화를 계산하거나 데이터를 시간 단위로 이동시킬 수 있는 것이다.

* .astype(int) : data type을 지정함.

 

- 아래 경우 처럼 두 칸씩 이동도 가능하며, fill_value 옵션은 빈 칸을 무엇으로 채울지에 대한 옵션이다.

 

- 또한, 음수를 입력하여 다음과 같이 데이터를 위로 올리는 것도 가능하다.

 

8. 한국식 날짜 표현 칼럼 추가하기

- 다음의 코드를 이용하여 한글 날짜 형식에 맞게 칼럼을 추가할 수 있으며, Y/M/D의 대소문자에 따라 표현이 달라지며, 다양한 날짜형식으로의 표현이 가능하다.

* 다음 형식 구분표를 참고하기를 바란다(출처 : https://docs.python.org/3.9/library/datetime.html#strftime-and-strptime-format-codes)

더보기
%a Weekday as locale’s abbreviated name.
Sun, Mon, …, Sat (en_US);
So, Mo, …, Sa (de_DE)
%A Weekday as locale’s full name.
Sunday, Monday, …, Saturday (en_US);
Sonntag, Montag, …, Samstag (de_DE)
%w Weekday as a decimal number, where 0 is Sunday and 6 is Saturday. 0, 1, …, 6
%d Day of the month as a zero-padded decimal number. 01, 02, …, 31
%b Month as locale’s abbreviated name.
Jan, Feb, …, Dec (en_US);
Jan, Feb, …, Dez (de_DE)
%B Month as locale’s full name.
January, February, …, December (en_US);
Januar, Februar, …, Dezember (de_DE)
%m Month as a zero-padded decimal number. 01, 02, …, 12
%y Year without century as a zero-padded decimal number. 00, 01, …, 99
%Y Year with century as a decimal number. 0001, 0002, …, 2013, 2014, …, 9998, 9999
%H Hour (24-hour clock) as a zero-padded decimal number. 00, 01, …, 23
%I Hour (12-hour clock) as a zero-padded decimal number. 01, 02, …, 12
%p Locale’s equivalent of either AM or PM.
AM, PM (en_US);
am, pm (de_DE)
%M Minute as a zero-padded decimal number. 00, 01, …, 59
%S Second as a zero-padded decimal number. 00, 01, …, 59
%f Microsecond as a decimal number, zero-padded to 6 digits. 000000, 000001, …, 999999
%z UTC offset in the form ±HHMM[SS[.ffffff]] (empty string if the object is naive). (empty), +0000, -0400, +1030, +063415, -030712.345216
%Z Time zone name (empty string if the object is naive). (empty), UTC, GMT
%j Day of the year as a zero-padded decimal number. 001, 002, …, 366
%U Week number of the year (Sunday as the first day of the week) as a zero-padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0. 00, 01, …, 53
%W Week number of the year (Monday as the first day of the week) as a zero-padded decimal number. All days in a new year preceding the first Monday are considered to be in week 0. 00, 01, …, 53
%c Locale’s appropriate date and time representation.
Tue Aug 16 21:30:00 1988 (en_US);
Di 16 Aug 21:30:00 1988 (de_DE)
%x Locale’s appropriate date representation.
08/16/88 (None);
08/16/1988 (en_US);
16.08.1988 (de_DE)
%X Locale’s appropriate time representation.
21:30:00 (en_US);
21:30:00 (de_DE)
%% A literal '%' character. %

 

 

★ 9. 실전과 비슷한 데이터를 활용하여 결측치 처리해보기 ★

-0 다음과 같이 새로운 data.csv 파일을 가져오자.

- 조금 더 보기 좋게 데이터프레임을 가공해보자.

pd.set_option('display.width', 80): 출력되는 데이터프레임의 텍스트 너비를 80으로 설정합니다. 이는 텍스트가 한 줄에 표시될 최대 문자 수를 나타냅니다.
pd.set_option('display.max_columns', 20): 최대로 표시될 열의 수를 20으로 설정합니다. 이는 데이터프레임의 열이 표시되는 최대 수를 조정합니다. 
pd.set_option('display.max_rows', 20): 최대로 표시될 행의 수를 20으로 설정합니다. 이는 데이터프레임의 행이 표시되는 최대 수를 조정합니다. 
pd.options.display.float_format = '{:,.2f}'.format: 부동 소수점 숫자를 출력할 때 소수점 이하 2자리까지만 표시하도록 포맷을 설정합니다. 예를 들어, 10.12345는 10.12로 표시됩니다.

 

챗 지피티야 늘 고맙다..!

라고 하네요. 훈훈하군.. ㅋㅋ

 

-1 결측치 확인하기

- 먼저 두 번째 코드를 이용해서, 컬럼 방향으로 결측치의 개수를 파악할 수 있으며,

 

- 행 방향으로 결측치의 개수가 N 개인 행이 N개 별 몇 행이 있는지도 알 수 있다.

-2 조건을 만족하는 결측치 추출하기

- 다음 코드처럼 결측치가 3개 이상인 데이터들을 추출하여 볼 수도 있다(5개 단위로 빨간 선으로 구분하였으니, 실제 18개가 잘 추출되고 있는 것을 확인해보자).

 

* 판다스의 Index Alignment 원칙

여기서 covidtotals는 데이터프레임이고, demovars_misscnt는 어떤 조건을 만족하는 불리언(boolean) 시리즈이다. 이 코드는 covidtotals 데이터프레임에서 demovars_misscnt 시리즈의 조건을 만족하는 행들을 선택하는데, 이 때 Index Alignment 원칙이 작용한다.

Index Alignment 원칙에 따라서 demovars_misscnt 시리즈의 인덱스와 covidtotals DF의 인덱스가 일치하게 되어 정확한 행들이 선택되고 정렬되는 것이다. 이렇게 함으로써 원하는 조건을 만족하는 데이터를 선택하고 다룰 때, 데이터 일관성과 누락을 방지할 수 있다.

직관적 사례로 s1+s2를 실행하면 15,35,55가 아닌
nan, 25, 45, nan 이 나오게 된다.

- 결측치 부분은 중요하므로 한 번더 실습을 해보려고 한다. 이번에는 칼럼을 바꾸어 코로나 관련 변수로만 진행해보겠다. 먼저 결측치가 있는지를 행을 기준으로 .value_counts()로 확인해본다. 그러면 다음과 같이 결측치가 두 개 있는 행이 있다고 나온다.

- 그러면 다음으로 해당 코드를 사용해서 어떤 행인지를 찾아서 보여줄 수 있다.

 

10. 이상치 개념 맛보기

- 먼저 다음의 코드를 통해 데이터프레임에 대해 'total_cases' 열의 값을 기준으로 분위수(quantile:q) 구간을 만들고, 그에 따라 새로운 열을 추가한다.

* precision=0으로 설정하면 분위수 계산 시 소수점 이하를 버리고 정수만을 고려

- 다음으로는 아래와 같이 crosstable 을 만들어보도록 하자.

 

- 이상치에 대한 정의는 다양하지만, 여기서는 매우낮음-매우낮음 ~ 매우높음-매우높음 이어지는 우하향선을 기준으로 두 칸 이상 떨어진 값들을 이상치로 정하여 조사를 해보고자 한다.

- 그중에서도 발생 건수는 낮음인데, 사망자 수가 높음으로 나온 나라를 추출했고, 예멘이 나오게 되었다.

 

 

 

 

 

반응형