Day 19 (Day 18 이어서)
<0304>
tidy data
각 변수가 열이고 각 관측치가 행이 되도록 배열한 데이터
▶깔끔한 데이터를 만들기 위해서는 melt해야 한다 == 컬럼에 있던 데이터를 행으로 녹여야 한다
국가통계포털이나 통계청 등에서 제공하는 데이터는 잘 정리된 데이터지만, 가공과 집계를 해놓은 상태로 깔끔하진 않은 경우가 많다.
모든 컬럼이 출력되게 설정하기
pd.options.display.max_columns = 5 #5개 컬럼까지만 보여준다 (기본값은 10개)
pd.options.display.max_columns = None # 전체 컬럼을 보여준다
pd.melt()
pd.melt(df_first, id_vars='지역')
# id_vars 녹이지 않고 기준으로 설정해 남길 컬럼(나머지 컬럼은 자동으로 value_vars가 된다)
# value_vars 컬럼에서 값으로 녹일 컬럼(컬럼 3개 중에서 2번째 컬럼으로 설정하면 3번째 컬럼은 버린다)
raw.melt(id_vars=raw.columns[:4], var_name='연월', value_name='달러')
# id_vars=raw.columns[:4] 남길 컬럼 여러 개 지정 가능
# var_name 컬럼에서 값으로 녹여진 열의 이름 설정
# value_name 값이 나열될 열의 이름 설정
연도월 분리해서 컬럼 생성하기★
1. 함수로 만들기
date="2022년10월"
# 연도
def parse_year(date):
return int(date.split('년')[0])
# 월
def parse_month(date):
return int(date.split('년')[1][:-1])
# apply로 연도/월만 추출하여 새로운 컬럼에 할당
df['연도'] = df_melt['기간'].apply(parse_year)
# apply() df에 함수를 적용해 반환하는 메서드
apply()와 map()
apply() | map() |
df, Series에 모두 사용 가능 | Series에만 사용 가능 |
단일/다중 컬럼 사용 가능 | 단일컬럼만 사용 가능 |
2. str accessor로 만들기
# 연도
df['기간'].str.split('년',expand=True)[0].astype(int)
# .str.split() 지정한 문자를 기준으로 문자열 분리
# expand=True df/multiindex로 반환 <> False Series, Index로 반환
# 월
df['기간'].str.split('년',expand=True)[1].str[:-1].astype(int)
#expand=True를 쓰지 않고 바꾸기
df["연월"].str.split(".")str[0].astype(int)
df["연월"].str.split(".")str[1].astype(int)
# split한 뒤 인덱스 앞에 str을 넣어 string을 그대로 가져올 수 있게 했다
Q. expand=True?
→ split을 하게되면 리스트가 값으로 들어간다. expand를 사용하면 리스트를 풀고 각각에 대해 값으로 사용할 수 있게 해주어 값의 변화가 반영된다.
→ expand를 지정하지 않았을 때 astype은 적용되지 않는다
3. 익명함수 lambda로 만들기
# 연도
df_first_melt['기간'].map(lambda x : int(x.split('년')[0]))
# 월
df_first_melt['기간'].map(lambda x : int(x.split('년')[1][:-1]))
Q. 연도월같은 날짜/요일 데이터를 int로 설정해야 하는 이유?
→ 기술통계 결과가 달라진다. int 타입일때는 count, mean, std, min, 25%, 50%, 75%, max를 보여주는 수치형 변수 기술통계가 나오는데, object타입일때는 count, unique, top, freq의 범주형 변수 기술통계가 나오게 된다.
컬럼명 동일하게 만들기
cols = ['지역구', '연도', '월', '분양가']
# 전용면적이 모든면적인 행만 가져와서 정의한 컬럼에 담아라
df_dataset1 = df.loc[df_last['전용면적'] == '모든면적', cols]
# 공통된 컬럼(cols)만 가져온 뒤 copy로 깊은 복사하기
df_dataset2 = df_first[cols].copy()
# df_dataset1과 df_dataset2의 컬럼이 동일해진다
<0305>
정규표현식
1. 반드시 기억할 것★
[0-9] : 0~9까지의 숫자 중 하나를 포함하고 있는가
[^0-9] : 숫자를 포함하고 있지 않음
2.
[ ] : 일치시킬 문자 세트의 패턴
[가나다] : 가 or 나 or 다 중에 하나를 포함하고 있는지
[가-힣] : 한글 가부터 힣까의 문자 중 하나를 포함하고 있는지
[0-9] : 0~9까지의 숫자 중 하나를 포함하고 있는지
[^0-9] : 숫자를 포함하고 있지 않음
[^가-힣] : 한글이 포함되어 있지 않음
[가-힣+] : 한글이 하나 이상 포함되는지
3.
클래스 | 표현식 | 설명 |
\d | [0-9] | 십진수와 일치 |
\D | [^0-9] | 숫자가 아닌 문자와 일치 |
\s | \s | 공백 문자와 일치 |
\S | [^\t\n\r\f\v] | 공백이 아닌 문자와 일치 |
\w | [a-zA-Z0-9_] | 모든 숫자 영문자와 일치 |
\W | [^a-zA-Z0-9_] | 영문자, 숫자가 아닌 것과 일치 |
4. 표현식설명
표현식 | 설명 |
^x | 문자열의 시작을 표현하며 x 문자로 시작 |
x$ | 문자열의 종료를 표현하며 x 문자로 종료 |
.x | 임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝남 |
x+ | 반복을 표현하며 x 문자가 한번 이상 반복됨 |
x* | 반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨 |
x? | 존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음 |
x|y | or 를 표현하며 x 또는 y 문자가 존재함 |
(x) | 그룹을 표현하며 x 를 그룹으로 처리함 |
(x)(y) | 그룹들의 집합을 표현하며 순서대로 번호를 부여하여 x, y 는 각 그룹의 데이터로 관리 |
(x)(?:y) | 그룹들의 집합에 대한 예외를 표현하며 그룹 집합으로 관리되지 않음 |
x{n} | 반복을 표현하며 x 문자가 n번 반복됨 |
x{n,} | 반복을 표현하며 x 문자가 n번 이상 반복됨 |
x{n,m} | 반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨 |
5. Pandas cheatsheet 예시 및 코드 예시
# 컬럼값에서 '액[$]' 제거하기
# 방법1 역슬래시 사용하여 문자 그대로 처리하여 제거하기
df['항목'].replace('액\[\$\]', '', regex=True)
# 방법2 문자 세트의 패턴을 그대로 [ ]안에 넣어 제거하기(패턴값을 정규표현식으로 인식해서 제거)
df['항목'].replace('액\[[$]]', '', regex=True)
# 방법3 남길 값 외 모든 문자 제거하기
df['항목'].replace('[^수입출]', '', regex=True)
replace()와 .str.replace() 예외 처리 결과 차이
replace(“액[$]”,’’)은 파이썬 내장함수로 정규표현식 사용 없이 문자열 그대로 변경한다
str.replace(“액[$]”,’’, regex=True)이것은 regex=True가 기본 값으로 정규표현식을 사용하기 때문에 변경되지 않는다
특정 컬럼명 변경하기
df.rename(columns={"국가및권역별": "국가권역", "전산업·소재부품장비산업별":"산업"})
#rename() dict형태로 변경 전:변경 후 컬럼 지정해 변환
시각화 관련 정보 알기
▷ print(plt.colormaps())
matplotlib 컬러맵 목록 골라쓰기 sns.__plot의 palette 파라미터, sns.heatmap의 cmap 파라미터 등에서 쓸 수 있다.
▷ swarmplot에서 오류 : duplicate labels >> df=df.reset_index()
▷ sns.heatmap( ... , annot=True, fmt=',.0f')
annot=True 각 cell에 값 표기 여부
fmt=',.0f' 셀 값 지정. 천 단위마다 ,를 쓰고 소수점은 나타내지 않는다.
형식지정자 | 의미 |
%.2f | 소수 둘째 자리까지 |
%.d | 정수로 |
%.s | 문자열로 |
%.c | 문자 1개 |
▷ plotly의 histfunc == seaborn의 estimate, color == seaborn의 hue →용어만 다르고 유사한 기능
px.histogram == seaborn의 barplot과 유사한 기능
▷ Plotly는 px.시각화형태
px.histogram(df_country, y='달러', x='국가권역', histfunc='sum', color='항목', barmode='group', height=600)
# barmode='group' stack하지 않고 수출/수입 별로 다른 막대로 설정하겠다
# height=600 높이(세로) <> width 너비(가로)
▷ Seaborn은 sns.시각화형태
sns.catplot(data=df_country.sort_values('항목', ascending=False), x='연', y='달러', hue='항목', col='산업', estimator=np.sum, kind='point', errorbar=None, palette='magma')
# estimator=np.sum 집계 방식 지정
▷ Matplotlib은 plt.시각화형태
plt.axhline(1500, c='y', lw=0.5, ls=":")
plt.figure(figsize=(12,8))
plt.legend(bbox_to_anchor=(1, 1))
plt.show()
▷ Pandas는 df.plot(kind='시각화형태')
df.plot(kind='bar') # 막대그래프 -수직
df.plot(kind='barh') # 막대그래프 -수평
df.plot(kind='line') # 선 그래프
df.plot(kind='hist') # 히스토그램 그래프
df.plot(kind='box') # 박스(사분위수) 그래프
df.plot(kind='kde') # 커널 밀도 그래프
df.plot(kind='area') # 면적 그래프
df.plot(kind='scatter') # 산점도 그래프
df.plot(kind='hexbin') # 고밀도 산점도 그래프

판다스 공식 문서 참고 https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html#
Chart visualization — pandas 1.5.0 documentation
Chart visualization Note The examples below assume that you’re using Jupyter. This section demonstrates visualization through charting. For information on visualization of tabular data please see the section on Table Visualization. We use the standard co
pandas.pydata.org
기타
▷ 컬럼명을 리스트로 만들때 to_list() 가 동작하지 않으면 tolist() 로 해보기
▷ nlargest() 큰 순서대로 상위 몇 개 가져온다
▷ df[~df['국가권역'].isin(world)]
국가권역 컬럼에서 world라는 변수에 저장된 값이 없는 데이터를 원한다
▷ pd.Series([1, 3, np.nan, 5])
결측값이 포함되면 데이터 타입은 object다
▷ 평균을 구할 때 주의해야 할 점 : 자료에 합계값이 있으면 통계가 왜곡된다
▷ 일단 하고 보자
최선의 방법은 아니더라도 내가 할 수 있는 방법으로 일단 적용해 보는 것이 중요하다. 나에게 가장 익숙하고 빠른 방법으로 시도 하자. 일단 되고 나서 더 나은 방법을 고민할 수 있다
출처) 멋쟁이 사자처럼 AI스쿨 7기 박조은 강사님 강의자료