5주 5일차 TIL 정리
5주 5일차에는 중간평가를 본 만큼, 중간평가를 위한 공부를 위주로 진행했다.
※ 짚고 넘어가야 할 내용 정리 ※
# pandas의 논리연산자
논리연산자는 '&' , '|' ,'~', '^' 기호를 사용한다.
# 특정 값을 가졌는지 여부
df['name'].isin(['Amy','Rose'])
# null 여부 판별
df.kor.isnull()
df.kor.notnull()
# 인덱스명으로 행 데이터 추출: loc
df.loc['i3'] # 시리즈
df.loc[['i1','i3','i5']] # 데이터프레임
# 인덱스, 컬럼에 해당하는 데이터 뽑아오기
df.loc['i1','kor'] # 인덱스 i1의 kor점수
df.loc['i1',['name','kor']] # 인덱스 i1 name, kor
# 여러 인덱스의 여러 컬럼 가져오기
df.loc[['i1','i3','i5'],['name', 'kor']]
df.loc[:,'name'] # 모든 인덱스의 name행
df.loc[:,:] # 모든 인덱스의 모든 행
# 행번호로 행데이터 추출: iloc
df.iloc[[1,3,5]]
df.iloc[1:4]
df.iloc[1:6:2]
df.iloc[::2]
# 열 추가/수정하기
df['no'] = range(1,len(df)+1) # 추가
df['sum'] = df['kor']+df['eng']+df['math'] # 추가
df['no'] = df['no']+99 # 수정
# 열 삭제/수정 등 확인
inplace = True
# 컬럼명 한번에 바꾸기
df.columns=['이름','국어','영어','수학']
# 마지막에 행 추가하고 인덱스 다시 지정하기
new_value = {'name':'Python','kor':80,'eng':90,'math':100}
df = df.append(new_value, ignore_index=True)
# 인덱스 지정하여 추가/수정하기
df.loc[35] = ['aaa',70,80,90] # 인덱스 35로 추가
# 행 삭제
df.drop(index=[30,34,35], inplace=True)
df = df.drop(index=[30,34,35])
# 함수로 컬럼의 데이터 변경
def plus5(x):
score = x+5
if score>=100:
score=100
return score
df_copy['math'] = df['math'].apply(plus5)
df_copy
# 결측치 확인
df.isnull().sum()
# 결측치 삭제
df.dropna() # 결측치 있는 모든 행 삭제
df.dropna(axis=1) # 결측치 있는 모든 열 삭제
# 결측치 대치
df.fillna(0) # 0으로
df.fillna(df.mean()) # 평균으로
df.fillna(method='ffill') # 이전 값
df.fillna(method='bfill') # 다음 값
# 시리즈와 데이터프레임의 자료형
# 시리즈
df['int'].dtype # 확인
df['int'] = df.astype('str') # 변환
# 데이터프레임
df.dtypes
# 자료형이 혼합된 컬럼을 숫자형으로 변경
pd.to_numeric(s2, errors='ignore') # 변경 불가하면 작업 x
pd.to_numeric(s2, errors='coerce') # 변경 불가하면 NaN으로 설정
pd.to_numeric(s2, errors='raise') # 변경 불가하면 error
# 시계열 데이터로 변환
df['출생'] = df['출생'].astype('datetime64')
df['사망'] = pd.to_datetime(df['사망'])
# 카테고리로 사용할 수 있는 컬럼은 카테고리형으로 변환
df['grade'] = df['grade'].astype('category')
# 카테고리 이름 바꾸기
df['grade'].cat.categories = ['A','B','C','D']
# 연, 월, 일, 분기 추출하기
df['출생'][0].year # 단일값이면 dt 안붙여도 됨
df['출생'].dt.month
df['출생'].dt.day
df['분기']=df['출생'].dt.quarter
# 요일, 월이름 추출하기
컬럼.dt.strftime('%a') : 요약된 요일이름
컬럼.dt.strftime('%A') : 긴 요일이름
컬럼.dt.strftime('%w') : 숫자요일(0:일요일)
컬럼.dt.strgtime('%b') : 요약된 월이름
컬럼.dt.strftime('%B') : 긴 월이름
# 데이터프레임 연결하기(concat)
df_rowconcat = pd.concat([df1,df2,df3]) # 컬럼 기준 연결
df_rowconcat = pd.concat([df1,df2,df3], join='inner') # 공통된 컬럼만 남기기
df_rowconcat = pd.concat([df1,df2,df3], ignore_index=True) # 인덱스 재지정
df_column_concat = pd.concat([df4,df5,df6], axis=1) # 인덱스 기준 연결
# 행을 열로 보내기(melt)
df.melt()
pd.melt(df)
# 고정할 컬럼 지정하여 melt
df.melt(id_vars=['name','kor'])
# 행으로 위치 변경
value_vars=[열이름리스트]
# 열을 행으로 보내기(pivot)
df.pivot(index='name', columns='subject',values='score')
# 행과 열 바꾸기
df.transpose()
# 그룹의 통계값 계산
df.groupby(그룹기준컬럼).통계적용컬럼.통계함수
count() : 누락값을 제외한 데이터 수
size() : 누락값을 포함한 데이터 수
mean() : 평균
sum() : 합계
std() : 표준편차
min() : 최소값
max() : 최대값
sum() : 전체 합
# 맷플롯립 pyplot 임포트
import matplotlib.pyplot as plt
# 그래프 종류
plt.scatter(x,y)
plt.plot(x,y)
plt.bar(x,y)
plt.barh(y,x)
plt.pie(value)
plt.hist(value)
plt.boxplot(value)
plt.violinplot(value)
plt.pcolor(dataframe) = sns.heatmap(df)
# 한글폰트 설정
plt.rcParams['font.family'] = 'Malgun Gothic'
# 한글폰트 사용 시 -기호 깨지는 문제 해결
plt.rcParams['axes.unicode_minus']=False
# 스타일링
linestyle, ls # 선스타일
linewidth, lw # 선 굵기
marker # 마커종류 (* . , o v ^ < > 1 2 3 4 s p * h H + x D d)
markersize, ms # 마커사이즈
markeredgecolor, mec # 마커 선 색깔
markeredgewidth, mew # 마커 선 굵기
markerfacecolor, mfc # 마커 내부 색깔
plt.plot(x,y,color='#A566FF', marker='D', ms='10', mec='b', mew='3', mfc='y', ls=':', lw=3)
plt.plot(x,y,'ro-', mec='b', mfc='b', lw=3, ms=7)
plt.show()
# 축의 범위
plt.xlim(1,12)
plt.ylim(0,100)
# 축의 틱
plt.xticks(range(0,14,1))
plt.yticks(range(0,110,10))
# 틱 레이블 지정
plt.xticks(range(0,14,1), labels=xticks_lable)
plt.yticks(range(0,110,10), labels=yticks_label)
# 틱 스타일 지정
plt.tick_params( )
direction # 틱 위치 (in, out, inout)
length # 틱의 길이
width # 틱의 두께
color # 틱 색상
labelcolor # 틱 레이블 색상
colors # 틱과 틱 레이블 색상
pad # 틱과 레이블 사이의 거리
labelsize # 틱 레이블 사이즈
axis # 축 지정
# 범례 지정
plt.legend()
열 개수 : plt.legend(ncol=열개수)
폰트 사이즈 : plt.legend(fontsize=폰트사이즈)
테두리 : plt.legend(frameon=True/False)
음영 : plt.legend(shadow=True/False)
바탕색 : plt.legend(facecolor=색상)
테두리색 : plt.legend(edgecolor=색상)
위치 지정 : plt.legend(loc=(x,y))
# 서브플롯 그리기 1
plt.subplot(전체행개수,전체열개수,그래프순서)
plt.subplot(221)
plt.plot(df1['x'],df1['y'],'o')
# 서브플롯 그리기 2
1)figure 객체를 생성한다.
fig = plt.figure(figsize=(8,6))
2) figure객체의 add_axes 메소드로 위치와 크기를 지정하여 axes 객체를 생성한다.
ax1 = fig.add_axes([0,0.5,0.4,0.4])
ax2 = fig.add_axes([0.5,0.5,0.4,0.4])
3) axes에 그래프를 그린다.
ax1.plot(df1['x'],df1['y'],'o')
ax2.plot(df2['x'],df2['y'],'r^')
4) axes에 제목 추가.
ax1.set_title('ax1')
ax2.set_title('ax2')
# 서브플롯 그리기 3(축 공유)
1) figure 객체를 생성한다.
fig = plt.figure(figsize=(9,6), facecolor='ivory')
2) 서브플롯을 그릴 axes 객체를 생성한다.
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2, sharex=ax1, sharey=ax1)
ax3 = fig.add_subplot(2,2,3, sharex=ax1, sharey=ax1)
ax4 = fig.add_subplot(2,2,4)
3) axes 객체에 그래프를 그린다.
4) 축 공유하기 : 어떤 axes의 축을 공유할 것인지 지정한다.
ax1.plot(df1['x'],df1['y'],'o', label='ax1')
ax2.plot(df2['x'],df2['y'],'^', label='ax2')
ax3.plot(df3['x'],df3['y'],'*', label='ax3')
ax4.plot(df4['x'],df4['y'],'+', label='ax4')
# 그래프를 이미지로 저장
fig.savefig('img150.png', dpi=150)
# 그래프에서 패턴 넣기
bars[0].set_hatch('.')
bars[1].set_hatch('/')
bars[2].set_hatch('+')
bars[3].set_hatch('-')
bars[4].set_hatch('*')
bars[5].set_hatch('|')
bars[6].set_hatch('o')
# 산점도 스타일링
s: size
c: color
cmap: color map
plt.scatter(tips['total_bill'], tips['tip'], s=tips['size']*50, alpha=0.5, c=tips['color'])
# 히스토그램 설정
bins= # 구간 개수 변경
cumulative=True # 누적값으로 변경
range=(min,max) # 범위 지정
density=True # 밀도 표시(도수/총 개수)
orientation='horizontal' # 가로 히스토그램으로 표시
histtype='step' # 아웃라인만 표시
rwidth=막대폭(0~1) color=막대색 alpha=투명도
edgecolor(ec)=선색 linewidth(lw)=선두께 linestyle(ls)=선스타일
hatch=패턴
# 박스플롯
plt.boxplot(series)
showmeans = True # 평균표시
meanline = True # 평균 선으로 표시
# 바이올린플롯
plt.violinplot(series)
showmeans
showmedians
# 파이차트
plt.pie(value)
labels=label목록
labeldistance = 그래프로부터 레이블을 얼만큼 떨어뜨려서 표시할것인가 (default:1.1)
autopct = '%소수점자리수%%'
pctdistance = 중심에서의 거리
explode=돌출정도리스트
startangle = 시작각도
counterclock=True/False (반시계/시계)
wedgeprops = {'ec':테두리컬러, 'lw':선두께, 'ls':선스타일, 'width':반지름에대한비율}
# 그래프를 구성하는 공통속성 지정: rcParams
# 그래프 영역 채우기 - 행방향으로 채우기
plt.fill_between(x[1:3], y[1:3], color='skyblue', alpha=0.5, hatch='/')
# 그래프 영역 채우기 - 열방향으로 채우기
plt.fill_betweenx(y[:2], x[:2], alpha=0.3)
# 두 그래프 사이 영역 채우기
plt.fill_between(x[1:3], y1[1:3], y2[1:3], color='darkorange')
# x,y좌표를 지정해 채우기
plt.fill([2.75, 3.25, 3.0],[2.5, 2.5, 3.5], color='pink')
# 수평선 그리기
plt.axhline(2,0,1, color='b', alpha=0.5, ls=':')
# 수직선 그리기
plt.axvline(1, 0, 0.5, ls='--', color='r')
# 텍스트 추가하기
plt.text(2.1, 3, '(x:2, y:3)', ha='left', va='bottom', fontsize=12, rotation=45
, bbox={'boxstyle':'round', 'fc':'skyblue', 'ec':'b', 'alpha':0.3})
# 화살표와 텍스트 추가하기
plt.annotate('(x:1,y:2)', xy=(1,2), xytext=(1.5,2.5)
, arrowprops={'width':1, 'headwidth':10, 'headlength':10, 'shrink':0.1, 'fc':'r'}
, fontsize=12, color='r')
# 두가지 정보를 하나의 그래프에 그리기
fig, ax = plt.subplots()
ax.bar(age, height, color='skyblue', width=0.5, ec='lightgray', label='height')
ax.plot(age, weight, color='darkred', marker='o', ls='-.', label='weight')
# 두가지 정보를 하나의 그래프에 그리기 - 이중축, 2중 y축
fig, ax1 = plt.subplots()
ax1.bar(age, height, color='skyblue', width=0.5, ec='lightgray', label='height')
ax2 = ax1.twinx()
ax2.plot(age, weight, color='darkred', marker='o', ls='-.', label='weight')
plt.show()
# seaborn 그래프
# 막대그래프
sns.barplot(data=tips, x='day', y='tip', ci=None, estimator=sum, hue='smoker' : ci는 추세선
, palette ={'Yes':'gray', 'No':'skyblue'}) : hue는 y를 그룹핑할 컬럼
# 산점도
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='day', size='size', alpha=0.5)
# 다중라인그래프
sns.lineplot(data=flights, x='month', y='passengers', ci=None, hue='year')
# 카운트플롯: 데이터 갯수 카운트해 시각화
sns.countplot(data=titanic, x='age')
sns.countplot(data=titanic, x='who', hue='alive')
# 러그플롯: 빈도수 파악
sns.rugplot(data=titanic,x='age', hue='alive')
# 히스토그램
sns.displot(data=iris, x='petal_length', bins=20, rug=True, hue='species', kde=True)
# 상자수염, 바이올린, 스트립, 스웜
# 상자수염그림
sns.boxplot(data=iris, x='species', y='petal_length')
# 바이올린플롯
sns.violinplot(data=iris, x='species', y='petal_length')
# 스트립플롯
sns.stripplot(data=iris, x='species', y='petal_length')
# 스웜플롯
sns.swarmplot(data=iris, x='species', y='petal_length',s=2)