1. 데이터 분석 모듈 import
# 기본 모듈
import os
# 데이터 분석 모듈
import pandas as pd
import numpy as np
# 시각화 모듈
import matplotlib.pyplot as plt
# 프로파일링 모듈
import pandas_profiling
pandas Tutorial : https://wikidocs.net/book/7188
[Python 완전정복 시리즈] 2편 : Pandas DataFrame 완전정복
안녕하세요! 파이썬 완전정복 시리즈의 저자 김태준 입니다. 파이썬 완전 정복 시리즈의 궁극적인 목표는 자신만의 알고리즘 트레이딩 프로그램 만들기 입니다. 본 도서는 ...
wikidocs.net
matplotlib Tutorial : https://wikidocs.net/book/5011
Matplotlib Tutorial - 파이썬으로 데이터 시각화하기
## 도서 소개 - 이 책은 파이썬의 대표적인 데이터 시각화 라이브러리인 Matplotlib의 사용법을 소개합니다. - 30여 개 이상의 다양한 주제에 대해 1 ...
wikidocs.net
pandas-profiling : https://wikidocs.net/47193
5) 판다스 프로파일링(Pandas-Profiling)
좋은 요리를 위해서는 조리 방법도 중요하지만, 그만큼 중요한 것은 갖고있는 재료의 상태입니다. 재료가 상하거나 문제가 있다면 좋은 요리가 나올 수 없습니다. 마찬가지로 좋은 ...
wikidocs.net
2. 분석 편의 설정
# 판다스 설정
# 데이터 프레임 표시 설정
pd.set_option('display.max_row', 200)
pd.set_option('display.max_columns', 200)
pd.set_option('display.unicode.east_asian_width', True) # 유니코드 사용 너비 조정
# 필요한 폴더 생성하기
def createFolder(directory):
try:
if not os.path.exists(directory):
os.makedirs(directory)
except OSError:
print ('Error: Creating directory. ' + directory)
createFolder('./output')
데이터 프레임을 표시하는데 생략(축약)되는 경우 display.max_row 옵션 값을 설정한다.
폴더가 필요할 때 마다 생성해서 쓸 수있도록 한다.
폴더 생성 관련 참고 : https://blockdmask.tistory.com/554
[python] 파이썬 폴더 생성 방법 os.mkdir, os.makedirs, os.getcwd
안녕하세요. BlockDMask입니다. 오늘은 파이썬에서 폴더를 생성하는 방법에 대해서 이야기해보려 합니다. <목차> 1. 파이썬 폴더 생성을 위한 os 모듈 사용법 2. 파이썬 폴더 생성 예제 1. python 디렉터
blockdmask.tistory.com
3. 데이터 로드하기
# CSV
df = pd.read_csv('xxx.csv', encoding='utf-8')
# encoding : 'CP949', 'latin', 'utf-8', etc..
# TEXT
df = pd.read_csv('ttt.csv', sep='|', encoding='utf-8')
# Ex.) 구분자가 탭(tab) : sep='\t'
# CSV / TEXT 데이터 로드할 때 전처리
#-----------------------------------------------------------------------------------------
# 특정 줄 제외하고 불러오기 : skiprows = [x, x]
df = pd.read_csv('xxx.csv', encoding='utf-8', sep=',', skiprows=[8, 9])
# 데이터 n개 행만 불러오기 : nrows = n
df = pd.read_csv('xxx.csv', encoding='utf-8', sep=',', skiprows=[8, 9], nrows=100)
# 사용자 정의 결측값 기호
df = pd.read_csv('xxx.csv', na_values=['', '[]', 'N/A', 'NA', 'nan', 'NaN', '-', 'null'])
#-----------------------------------------------------------------------------------------
# PARQUET
df = pd.read_parquet('yyy.csv')
# PARQUET 데이터 로드할 때 전처리
#-----------------------------------------------------------------------------------------
# 특정컬럼만을 로드해오기 : columns=['ID', 'NUMBER', 'COLUMN_NAME']
df = pd.read_parquet('yyy.csv', columns=['ID', 'NUMBER', 'COLUMN_NAME'])
#-----------------------------------------------------------------------------------------
# EXCEL
df = pd.read_excel(io='yyy.xlsx', sheet_name='sheet_1')
# sheet 이름 미지정 시 첫번째 시트를 가져온다.
# EXCEL 데이터 로드할 때 전처리
#-----------------------------------------------------------------------------------------
# 필요한 열만 가져오기 : usecols='B, D, G:K'
df = pd.read_excel(io='yyy.xlsx', sheet_name='sheet_1', usecols='B, D, G:K')
#-----------------------------------------------------------------------------------------
데이터를 로드하면서 기본적인 전처리를 수행하면 속도 및 분석에 용이하다.
CSV, TEXT : https://rfriend.tistory.com/250
[Python pandas] text, csv 파일 불러오기 : pd.read_csv()
Python 을 가지고 분석에 활용한다고 했을 때 데이터 전처리에 NumPy와 pandas library를 많이 사용합니다. 특히, 행과 열로 구성이 되어있는 DataFrame type 데이터를 입력, 처리, 조작할 때 pandas 가 매우 강
rfriend.tistory.com
PARQUET : https://beomi.github.io/2020/01/29/Use-parquet-on-pandas/
Pandas에서 Parquet 사용하기 with Snappy/Gzip - Beomi's Tech blog
Pandas나 PySpark등을 사용하다보면 *.csv 포맷으로는 만족하지 못하는 경우가 많다. 예를들어.. Data Type이 저장되지 않는다. 너무 많은 데이터는 저장해도 CSV의 이점(엑셀로 열어볼 수 있다)을 살리지
beomi.github.io
EXCEL : https://digital-play.tistory.com/66
[Python Pandas] 데이터 불러오기 Excel 파일
Python Pandas는 다음과 같은 다양한 형식의 데이터를 불러와서 데이터 프레임(DataFrame)에 저장할 수 있습니다. Pickle - read_pickle() CSV - read_csv() Excel - read_excel(), ExcelWrite(), ExcelFile.pa..
digital-play.tistory.com
4. 로드한 데이터 확인하기
# 1. 데이터 프레임 형태 보기
df.shape # 행과 열을 정보를 튜플형태로 표시한다.
# 2. 데이터 Sample 보기
df.head()
df.head(100)
df.tail()
df.tail(100)
# 3. 데이터 컬럼들 살펴보기
df.columns
# 4. 데이터 요약정보
df.info() # 종합정보
df.dtypes # 컬럼별 데이터 타입 확인
# 5. 연속형(정수, 실수 등 숫자형) 데이터 통계요약
df.describe()
df['나이'].describe()
# 6. 컬럼 값 분포 확인하기
df.value_counts('나이') # '나이' 필드의 값 분포를 확인 예제.
df['나이'].value_counts()
df.value_counts('나이', ascending=True) # 오름차순으로 정렬
df['나이'].value_counts().index #시리즈 인덱스 추출하기
df['나이'].value_counts().index.tolist() #추출한 인덱스를 list화하기
# 해당 인덱스를 컬럼 안의 값으로 만들어보자.
df['나이'].value_counts().reset_index() #reset_index()를 하면서 DataFrame Type으로 변경.
pd.DataFrame(df['나이'].value_counts().reset_index()) #위와 동일하다.
pd.DataFrame(df['나이'].value_counts()) #위와 유사하나 index값의 차이가 분명 있으니 참고.
# 7. 정렬
df['나이'].sort_values() # 특정 컬럼 정렬
df.sort_values(by = ['나이', '잔고']) # 특정 컬럼 기준으로 정렬
df.sort_values(by = ['나이', inplace=True] # 현재 정렬한 상태를 df에 저장(변경)
df2 = df.sort_values(by=['나이'], inplace=False)
5. 데이터 조작
# 1. 컬럼 및 Default 데이터 생성
df['국가'] = '한국' #컬럼을 추가하면서 Default값으로 '한국'이 들어감
# 2. 데이터 수정
df['국가'] = '미국' #컬럼의 전체 데이터 수정
# 3. 개별 값 설정
# Apply 적용을 위한 함수 선언
def tag_fun(Age):
name = ''
if Age <= 25:
tag = '사회초년생'
elif Age <= 35:
tag = '사회생활 1~10년차'
elif Age <= 45:
tag = '관리자 역할'
else:
tag = '은퇴예정자'
return name
df['사회생활_Tag'] = df['나이'].apply(lambda x : tag_fun(x)) # Apply를 통해 개별적용
6. 데이터 합치기
import pandas as pd
# 테트스 하고자하는 데이터 프레임 생성
df1 = pd.DataFrame({'a':['a0','a1','a2','a3'],
'b':['b0','b1','b2','b3'],
'c':['c0','c1','c2','c3']},
index = [0,1,2,3])
df2 = pd.DataFrame({'a':['a2','a3','a4','a5'],
'b':['b2','b3','b4','b5'],
'c':['c2','c3','c4','c5'],
'd':['d2','d3','d4','d5']},
index = [2,3,4,5])
# 결과
[df1]
a b c
0 a0 b0 c0
1 a1 b1 c1
2 a2 b2 c2
3 a3 b3 c3
[df2]
a b c d
2 a2 b2 c2 d2
3 a3 b3 c3 d3
4 a4 b4 c4 d4
5 a5 b5 c5 d5
#############################################################
# concat : default axis=0 으로 설정되어 위아래로 붙임.
#############################################################
result1 = pd.concat([df1, df2])
# 결과 : 컬럼은 합집합으로 하고 비어있는 값은 NaN으로 체워짐
[Output]
a b c d
0 a0 b0 c0 NaN
1 a1 b1 c1 NaN
2 a2 b2 c2 NaN
3 a3 b3 c3 NaN
2 a2 b2 c2 d2
3 a3 b3 c3 d3
4 a4 b4 c4 d4
5 a5 b5 c5 d5
#위 잴 앞줄 index 재정렬할 필요가 있음 : ignore_index=True
result1 = pd.concat([df1, df2], ignore_index=True)
# 결과
a b c d
0 a0 b0 c0 NaN
1 a1 b1 c1 NaN
2 a2 b2 c2 NaN
3 a3 b3 c3 NaN
4 a2 b2 c2 d2
5 a3 b3 c3 d3
6 a4 b4 c4 d4
7 a5 b5 c5 d5
# axis=1 설정 : 좌우로 붙이기
result3 = pd.concat([df1,df2],axis=1)
# 결과
a b c a b c d
0 a0 b0 c0 NaN NaN NaN NaN
1 a1 b1 c1 NaN NaN NaN NaN
2 a2 b2 c2 a2 b2 c2 d2
3 a3 b3 c3 a3 b3 c3 d3
4 NaN NaN NaN a4 b4 c4 d4
5 NaN NaN NaN a5 b5 c5 d5
# concat join 옵션 : inner(교집합), outer(합집합)
result3_in = pd.concat([df1,df2],axis=1, join='inner') #열방향(axis=1), 교집합(inner)
# 결과
a b c a b c d
2 a2 b2 c2 a2 b2 c2 d2
3 a3 b3 c3 a3 b3 c3 d3
# 시리즈 객체도 데이터 프레임에 이어 붙이기 가능
sr1 = pd.Series(['e0','e1','e2','e3'], name = 'e')
sr2 = pd.Series(['f0','f1','f2'], name = 'f', index = [3,4,5])
sr3 = pd.Series(['g0','g1','g2','g3'], name = 'g')
result4 = pd.concat([df1,sr1], axis=1)
# 결과
a b c e
0 a0 b0 c0 e0
1 a1 b1 c1 e1
2 a2 b2 c2 e2
3 a3 b3 c3 e3
result5 = pd.concat([df2,sr2], axis=1)
# 결과
a b c d f
2 a2 b2 c2 d2 NaN
3 a3 b3 c3 d3 f0
4 a4 b4 c4 d4 f1
5 a5 b5 c5 d5 f2
# 시리즈 객체끼리 붙이기(좌우, 상하)
result6 = pd.concat([sr1, sr3], axis = 1) #열방향 연결, 데이터프레임이 되었다.
# 결과
e g
0 e0 g0
1 e1 g1
2 e2 g2
3 e3 g3
데이터 타입은 <class 'pandas.core.frame.DataFrame'>
result7 = pd.concat([sr1, sr3], axis = 0) #행방향 연결, 시리즈로 유지된다.
# 결과
0 e0
1 e1
2 e2
3 e3
0 g0
1 g1
2 g2
3 g3
dtype: object
데이터 타입은 <class 'pandas.core.series.Series'>
#############################################################
# merge : 데이터에 존재하는 고유값(key)을 기준으로 병합
#############################################################
# merge 기본형
pd.merge(df_left, df_right, how='inner', on=None)
merge_inner = pd.merge(df1, df2)
# 아무 옵션 사용하지 않으면 on=None으로 두 데이터의 공통 열이름을 기준으로 inner(교집합) 조인
merge_outer = pd.merge(df1,df2, how='outer',on='id')
# on='id'를 기준으로 outer(합집합) 조인, 어느한쪽에라도 없는 데이터가 있는 경우 NaN값이 지정
merge_left = pd.merge(df1,df2, how='left', left_on='stock_name', right_on='name')
# 각 프레임의 Key가 되는 열을 지정, 왼쪽 데이터 프렘의 키값 기준으로 merge
set(df1['stock_name'].unique()) - set(df2['name'].unique())
# 유니크한 컬럼으로 set을 만들어 차집합해보면 d1에는 있고, d2에는 없어서 NaN으로 값이 체워짐
merge_right = pd.merge(df1, df2, how='right', left_on='stock_name', right_on='name')
set(df2['name'].unique()) - set(df1['stock_name'].unique())
# d2에는 있는데 d1에는 없는 고유값 확인
#############################################################
# join : merge랑 비슷하나 행 "인덱스"를 기준으로 결합
#############################################################
# 기본형
Dataframe1.join(Dataframe2. how='left')
# join함수는 인덱스를 기준으로 결합하기 때문에 index를 지정해 주자.
df1.set_index('id', inplace=True)
df2.set_index('id', inplace=True)
# 각 df1, df2의 id열을 index로 set한다.
# join
df1.join(df2)
# merge함수와 유사함.(큰 차이 없음.)
7. groupby
데이터를 특정 기준으로 그룹핑할 때 사용. 엑셀의 피봇 테이블과 유사.
################################################
# groupby()
################################################
# 분석 시 그룹별 통계분석을 실시하는 경우가 많다.
#groupby()를 사용할 때는 반드시 aggregate하는 통계함수와 일반적으로 같이 적용함.
df.groupby('sex').mean()
# 성별('sex')을 기준으로 그룹핑하여 성별 평균을 살펴보았다.
# 2개 이상의 컬럼으로 그룹핑
# 성별, 좌석등급 별 통계
df.groupby(['sex', 'pclass']).mean()
# 여자-pclass1, 2, 3, .. 과 남자-pclass1, 2, 3, ..과 같이 그룹을지어 평균값
# 1개 특정 컬럼에 대한 결과만 도출하고자 한다면 해당 필드 선언
# 성별, 좌석등급 별 통계
df.groupby(['sex', 'pclass'])['survived'].mean()
# 결과에서 그룹핑 기준이 되는 'sex'와 'pclass'는 index로 설정되어 있다.
# 하나의 깔끔한 DataFrame으로 변경하기 위해서는 index를 reset해주자.(인덱스 초기화)
df.groupby(['sex', 'pclass'])['survived'].mean().reset_index()
# 여러 가지 통계 값을 적용할 때에는 agg()를 사용
df.groupby(['sex', 'pclass'])[['survived', 'age']].agg(['mean', 'sum'])
# numby의 통계 함수도 적용 가능 따옴표 있고 없고 차이 구분(결과는 위와 동일)
# 성별, 좌석등급 별 통계
df.groupby(['sex', 'pclass'])[['survived', 'age']].agg([np.min, np.median, np.max, np.mean, np.sum])
################################################
# aggregate()
################################################
df.groupby('key').aggregate({'data1':'min', 'data2':np.median})
# key 컬럼으로 groupby를 하는데 aggregate로 data1은 min값을 찾고, data2에 대해서는 np.median으로 중위수를 구한다.
# 결과
data1 data2
key
A 1 4
B 2 10
C 3 7
################################################
# filter()
################################################
# groupby를 통해서 그룹의 속성을 기준으로 데이터를 필터링할 때 사용.
def filter_by_mean(x):
return x['data2'].mean() > 3
df.groupby('key').mean()
df.groupby('key').filter(filter_by_mean) #위 필터함수를 이용해서 필터링
# 'key'값을 기준으로 그룹핑해서 'data2'의 평균값이 3 초과 하는 그룹들의 데이터만 필터링
################################################
# get_group()
################################################
# groupby로 묶인 데이터에서 key값으로 데이터를 가져올때 사용.
# 데이터 추출
df.groupby('시도').get_group('충남')
len(df.groupby('시도').get_group('충남'))
판다스 groupby() : https://wikidocs.net/136718
5. groupby() - 그룹
table.dataframe { white-space: normal; width: 100%; height: 240px; ...
wikidocs.net
판다스 groupby() 응용 : https://ponyozzang.tistory.com/291
Python Pandas 데이터 분석 groupby 사용 방법 예제
파이썬에서 데이터 분석, 처리를 할 때 많이 팬더스(Pandas) 사용합니다. 그중에서 groupby를 사용해야 하는 경우가 있어 정리를 하게 되었습니다. Python Pandas groupby 라이브러리 import import pandas as pd..
ponyozzang.tistory.com
기타
판다스 데이터 프레임 생성하기 : https://koreadatascientist.tistory.com/10
파이썬 판다스 라이브러리에서 데이터프레임 생성하기, 판다스 공식문서 참조, pandas_cheat_sheet, p
파이썬 판다스 라이브러리에서 데이터프레임 생성하기, 판다스 공식문서 참조, pandas_cheat_sheet, pd.DataFrame() 안녕하세요 ! 오늘의 주제는 기본적으로 행과 열을 갖고 있는 형태를 만들어볼
koreadatascientist.tistory.com
'Data Science' 카테고리의 다른 글
[Data Science 기초][1] Series (0) | 2022.11.28 |
---|---|
판다스 이용해 큰 CSV파일에서 일부 읽어오기 (0) | 2022.10.25 |
판다스 극강의 라이브러리!! (0) | 2022.03.28 |
[통계분석] 1. 변수와 척도 (0) | 2022.01.17 |
[수학]가설검정 (0) | 2022.01.05 |