myString.strip().split()를 사용하는 방법에 대해 간단한 예제를 통해 알아보겠습니다.
예제는 쉼표(,)와 마이너스('-')가 복합적으로 되어 있는 데이터를 프레임으로 재구성하는 코드입니다.
각 월마다 생성된 학생들 점수 데이터 예시 (data.txt)
001-김철수,002-박영희,003-홍길동,004-이영수,005-장미영,006-박철호,007-김미경,008-서영미,009-임성훈,010-이준호,011-최지수,012-박한나,013-정지원,014-최진영,015-이승민,016-황수민,017-박민재,018-김소연,019-장동욱,020-손영철
001-70,002-85,003-75,004-60,005-95,006-80,007-65,008-75,009-55,010-80,011-90,012-75,013-85,014-95,015-70,016-80,017-75,018-85,019-60,020-70
001-김철수,002-박영희,003-홍길동,004-이영수,005-장미영,006-박철호,007-김미경,008-서영미,009-임성훈,010-이준호,011-최지수,012-박한나,013-정지원,014-최진영,015-이승민,016-황수민,017-박민재,018-김소연,019-장동욱,020-손영철
001-72,002-80,003-78,004-65,005-92,006-85,007-63,008-73,009-50,010-78,011-93,012-73,013-80,014-96,015-72,016-82,017-76,018-88,019-61,020-71
코드를 실행 후 출력 결과
김철수,박영희,홍길동,이영수,장미영,박철호,김미경,서영미,임성훈,이준호,최지수,박한나,정지원,최진영,이승민,황수민,박민재,김소연,장동욱,손영철
70,85,75,60,95,80,65,75,55,80,90,75,85,95,70,80,75,85,60,70
72,80,78,65,92,85,63,73,50,78,93,73,80,96,72,82,76,88,61,71
코드
data = [] # 빈 리스트 생성
columns = [] # 빈 리스트 생성
# 파일 열기
with open('data.txt', 'r') as f:
for i, line in enumerate(f):
if i == 0: # 첫 번째 줄(헤더) 처리
columns = [col.split('-')[1] for col in line.strip().split(',')] # 헤더에서 열 이름 추출
else: # 두 번째 줄부터 데이터 처리
items = line.strip().split(',')
student1, student2 = items[0].split('-') # 첫 번째 열에서 이름 추출
if re.search('[가-힣]', student2) is not None: # 한글이 포함된 데이터는 제외
continue
times = [time.split('-')[1] for time in items] # 시간 데이터 추출
if len(times) < 20: # 데이터가 20개 미만인 경우 빈 시간 데이터를 0으로 채움
times.append(0)
data.append(times) # 추출한 시간 데이터를 리스트에 추가
df = pd.DataFrame(data, columns=columns) # 데이터프레임 생성
df.to_csv('data.csv', index=False, encoding='utf-8-sig') # 데이터프레임을 csv 파일로 저장
print(df) # 데이터프레임 출력
코드 분석하면 with open 문을 이용해서 파일을 열고, enumerate() 함수를 이용해서 각 줄에 인덱스를 붙입니다. 헤더를 처리해서 열 이름을 추출하고, 데이터를 처리해서 이름, 점수 등을 추출합니다. 이때, 한글이 포함된 데이터는 제외합니다. 시간 정보는 리스트 형태로 추출하고, 데이터가 40개 미만인 경우, 빈 시간 데이터를 0으로 채웁니다. 추출한 시간 데이터를 data 리스트에 추가합니다.
이렇게 추출한 data 리스트를 이용해서 데이터프레임을 생성하고, 반환합니다. 즉, read_data() 함수는 파일에서 데이터를 읽어서 데이터프레임으로 반환하는 역할을 합니다.
with open(filename, 'r') as f:
for i, line in enumerate(f):
with open 문을 이용해서 파일을 열고, enumerate() 함수를 이용해서 각 줄에 인덱스를 붙입니다.
if i == 0:
columns = [col.split('-')[1] for col in line.strip().split(',')]
if i == 0:는 파일에서 읽은 줄(line)의 인덱스(i)가 0인 경우에만 실행됩니다. 즉, 파일의 첫 번째 줄(헤더)인 경우에만 열 이름을 추출하는 코드가 실행됩니다.
columns = [col.split('-')[1] for col in line.strip().split(',')]는 헤더에서 쉼표(,)로 구분된 각 열의 이름을 추출하는 코드입니다. line.strip().split(',')는 파일에서 읽어온 한 줄(line)을 쉼표로 구분해서 리스트로 분리합니다. 분리된 리스트 각 요소들(col)에서 -을 기준으로 문자열을 분리하고, 그 중에서 두 번째 요소([1])를 선택해서 columns 리스트에 추가합니다.
이렇게 추출한 columns 리스트는 이후에 생성될 데이터프레임의 열 이름으로 사용됩니다.
else:
# 파일에서 읽어온 한 줄을 쉼표로 분리합니다.
items = line.strip().split(',')
# 첫 번째 열에서 이름을 추출합니다.
student1, student2 = items[0].split('-')
# 이름에 한글이 포함되어 있는 경우 데이터를 무시합니다.
if re.search('[가-힣]', student2) is not None:
continue
# 시간 정보를 추출합니다.
times = [time.split('-')[1] for time in items]
# 만약 시간 정보가 20개 미만인 경우, 빈 시간 데이터를 0으로 채웁니다.
if len(times) < 20:
times.append(0)
# 추출한 시간 정보를 data 리스트에 추가합니다.
data.append(times)
items = line.strip().split(',')는 파일에서 읽어온 한 줄을 쉼표로 분리해서 리스트로 저장합니다. 이 리스트에서 첫 번째 열에서 이름을 추출합니다.
student1, student2 = items[0].split('-')는 첫 번째 열에서 이름을 추출합니다. items[0]에서 -을 기준으로 문자열을 분리하고, student1과 student2변수에 저장합니다.
if re.search('[가-힣]', student2) is not None:는 이름에 한글이 포함되어 있는지 검사합니다. re.search() 함수는 정규식을 이용해서 문자열에서 패턴을 검색하는 함수입니다. [가-힣]은 한글 문자를 의미합니다. 따라서, student2에서 한글이 포함되어 있다면, if 구문 내부의 코드를 실행하지 않고 다음 반복문으로 넘어갑니다.
times = [time.split('-')[1] for time in items]는 점수를 추출하는 코드입니다. items 리스트에서 점수가 있는 요소들을 선택해서, -을 기준으로 문자열을 분리하고, 그 중에서 두 번째 값을 times 리스트에 저장합니다.
if len(times) < 20: times.append(0)는 시간 정보가 20개 미만인 경우, 빈 점수 데이터를 0으로 채워주는 코드입니다.
data.append(times)는 추출한 점수를 data 리스트에 추가하는 코드입니다.
df = pd.DataFrame(data, columns=columns) # 데이터프레임 생성
df.to_csv('data.csv', index=False, encoding='utf-8-sig') # 데이터프레임을 csv 파일로 저장
pd.DataFrame() 함수를 사용하여 data 리스트와 columns 리스트를 이용하여 데이터프레임을 생성합니다. data 리스트는 이전에 파일에서 추출한 데이터를 저장한 리스트이고, columns 리스트는 이전에 파일에서 추출한 열 이름(헤더)을 저장한 리스트입니다. pd.DataFrame() 함수는 data 리스트와 columns 리스트를 이용하여 데이터프레임을 생성하고, df 변수에 할당합니다.
DataFrame 클래스 객체인 df를 사용하여 to_csv() 메소드를 호출하여 데이터프레임을 CSV 파일로 저장합니다. 인자로 파일 이름('data.csv')을 지정하고, index=False 옵션을 사용하여 인덱스를 파일에 저장하지 않도록 합니다. 이렇게 생성된 CSV 파일은 data.csv라는 이름으로 현재 작업 디렉토리에 저장됩니다.
이렇게 데이터 분석하는 과정에서 데이터 전처리하였습니다. 다음 시간에는 전처리한 데이터를 가공하고 의미있는 값을 도출해보겠습니다.
'코딩 > Python' 카테고리의 다른 글
[python] 2중 리스트 기초 사용법 (2) | 2023.04.09 |
---|---|
[python] 정규식 compile로 웹크롤링 데이터 불러오기 (0) | 2023.04.06 |
[Python] 간단한 체스 나이트 이동 코드 (0) | 2023.04.03 |