본문으로 바로가기

 


 

str.contains : 엑셀에서 'Ctrl + F'한 것과 동일하다 

파이썬 re패키지 : 엑셀에서 '열'을 선택한 후 'Ctrl + F'한 후 '모두 바꾸기' 한 것과 동일한 결과이다. 

 

예제파일

IPO_list.xlsx
0.02MB

 

# 환경구축

import numpy as np
import pandas as pd
import re


# 예제파일 불러오기
# 예제파일은 작업하는 파이썬과 같이 경로에 있어야 한다.

ipo2021_df = pd.read_excel('IPO_list.xlsx', sheet_name='2021')
ipo2021_df

 

# 데이터프레임 정보조회
# 신규상장일 칼럼을 제외하고 데이터는 모두 object 타입이다.

print(ipo2021_df.info(), ipo2021_df.isna().sum())

pd.set_option('display.max_rows', None)  # 데이터프레임의 '행' 모두 나오게 하기
ipo2021_df.sort_values('시초/공모(%)', ascending=False)  # '시초/공모(%) 높은 순서로 출력하기 
ipo2021_df

 

# value와 dtype 확인

print(ipo2021_df['시초/공모(%)'][0], type(ipo2021_df['시초/공모(%)'][0]))

'시초/공모(%)' 높은 순서로 출력하려고 해도, 해당 데이터의 타입은 문자열(string)이기 때문에 정렬(sort_values)이 의도한대로 되지 않는다. 따라서 '시초/공모(%)' 칼럼의 데이터 타입을 의도한대로 정렬이 될 수 있는 '숫자(int, float)'타입으로 바꿔야 한다.  

 

데이터 찾기

 

가끔 데이터를 입력할 때, 숫자 0을 작대기 -로 표시하는 사람도 있다. 이 경우 데이터가 존재하기 때문에 결측치로 확인되지 않는다. 다만, 해당 문자(-)가 존재하기 때문에 숫자형(numeric type)으로 변경하려는 경우 ValueError: invalid literal for int() with base 10: '-\xa0' 가 발생한다.

오류를 해결하기 위해서는 작대기(-) 등을 데이터 모델링 전에 제거/변환해야 한다. 이 작업을 '데이터 전처리'라 부른다. 아래 코드를 실행하면 '1' 이 나온다. 즉, 해당 칼럼에 작대기(-)가 포함된 데이터(행)가 1개 있음을 알 수 있다. 해당 행(row)을 지우거나 0과 같은 숫자로 대체한다.

# 데이터프레임명['칼럼명'].str.contains('찾을문자').sum()

ipo2021_df['첫날종가(원)'].str.contains('-').sum()

 
# 작대기(-)를 공백으로 바꾼 후, 작대기가 포함된 행 조회

ipo2021_df['현재가(원)'] = ipo2021_df['현재가(원)'].map(lambda x : re.sub(r'-','',x))
ipo2021_df['공모가(원)'] = ipo2021_df['공모가(원)'].map(lambda x : re.sub(r'-','',x))
ipo2021_df['시초가(원)'] = ipo2021_df['시초가(원)'].map(lambda x : re.sub(r'-','',x))
ipo2021_df['첫날종가(원)'] = ipo2021_df['첫날종가(원)'].map(lambda x : re.sub(r'-','',x))

ipo2021_df['첫날종가(원)'].str.contains('-').sum()

 

데이터 바꾸기

# 해당 칼럼의 '%'를 제거하거나 치환한다. 
# map함수와 re함수를 이용하여 문자열(%)을 공백('')으로 바꾼다

ipo2021_df['시초/공모(%)'] = ipo2021_df['시초/공모(%)'].map(lambda x : re.sub(r'%', '', x))
ipo2021_df

 

# value와 dtype 확인

print(ipo2021_df['시초/공모(%)'][0], type(ipo2021_df['시초/공모(%)'][0]))

 


 

간단하게 re함수 쓰는법은 아래와 같다. 

# re는 regular expression의 약자이다. 입력한 패턴과 일치하는 문자열을 '검색', '치환', '제거'하는 기능이 있다.

import re  # re패키지 호출


a = 'abc\n'   #  \n 은 문자열에서 줄바꿈을 의미하므로 출력하지 않는다
print(a)    

b = r'abc\n'  # '문자열' 앞에 r이 붙는 경우, 해당 문자열을 그대로 반환
print(b)

 


 

ipo2021_df["시초/공모(%)"] = ipo2021_df["시초/공모(%)"].astype('float')  # dtype (str >> float)
ipo2021_df.sort_values("시초/공모(%)", ascending=False, inplace=True)  # ipo2021_df 정렬하기
ipo2021_df

 

 

# 시초가가 공모가의 두배를 형성한 종목선별

따블 = ipo2021_df.loc[ipo2021_df["시초/공모(%)"] == 100]
따블.reset_index(drop=True, inplace=True)
따블

 

# 2021년 상장한 주식종목중 첫날 시초가 두배를 형성한 종목이 차지하는 비율

시초가_2배 = len(따블.index) / len(ipo2021_df.index) * 100
print(f'{시초가_2배:.2f}%')