본문 바로가기
Python/멋사_AIS7

Day 19

by Hi_heidi 2022. 10. 13.

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 예시 및 코드 예시

 

Pandas Cheat Sheet

# 컬럼값에서 '액[$]' 제거하기

# 방법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=Truefmt=',.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') # 고밀도 산점도 그래프

 

기타

▷ 컬럼명을 리스트로 만들때  to_list() 가 동작하지 않으면 tolist() 로 해보기

nlargest() 큰 순서대로 상위 몇 개 가져온다

▷ df[~df['국가권역'].isin(world)]

국가권역 컬럼에서 world라는 변수에 저장된 값이 없는 데이터를 원한다

pd.Series([1, 3, np.nan, 5])

결측값이 포함되면 데이터 타입은 object

▷ 평균을 구할 때 주의해야 할 점 : 자료에 합계값이 있으면 통계가 왜곡된다

▷ 일단 하고 보자

최선의 방법은 아니더라도 내가 할 수 있는 방법으로 일단 적용해 보는 것이 중요하다. 나에게 가장 익숙하고 빠른 방법으로 시도 하자. 일단 되고 나서 더 나은 방법을 고민할 수 있다

 

출처) 멋쟁이 사자처럼 AI스쿨 7기 박조은 강사님 강의자료

'Python > 멋사_AIS7' 카테고리의 다른 글

Day 20~23  (3) 2024.01.25
Day 18  (0) 2022.10.12
Day 16  (0) 2022.10.06
Day 15  (0) 2022.10.06
Day 14  (0) 2022.10.04