웅진 STARTERS 부트캠프

5주 5일차 TIL 정리

WoodenStella 2023. 3. 10. 17:42

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)