텍스트 열 결합과 정리
여러 열을 하나의 문자열로 연결하고 공백을 제거하며 일관되지 않은 범주 레이블을 정규화합니다.
텍스트 열 결합과 정리은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
텍스트 열 연결하기
여러 열의 값을 결합하여 하나의 문자열을 만드는 작업은 일반적인 데이터 준비 과정입니다. 예를 들어 이름과 성으로 전체 이름을 만들거나, 거리·도시·국가로 주소를 만들 수 있습니다. Pandas에서는 숫자 열을 .astype(str)로 문자열로 변환한 후 두 Series(또는 Series와 문자열 리터럴)에 + 연산자를 사용하여 문자열 열을 연결합니다.
import pandas as pd
df = pd.DataFrame({
'first_name': ['Alice', 'Bob', 'Carol'],
'last_name': ['Smith', 'Jones', 'White']
})
df['full_name'] = df['first_name'] + ' ' + df['last_name']
print(df['full_name'].tolist())
# ['Alice Smith', 'Bob Jones', 'Carol White']문자열이 아닌 열과 연결하기
숫자 열과 문자열 열을 결합할 때는 먼저 숫자 열을 .astype(str)로 문자열로 변환해야 합니다. 문자열 Series와 정수 Series를 더하려고 하면 Python의 + 연산자가 TypeError를 발생시킵니다. 이는 서로 다른 형식의 열로 복합 키나 레이블을 만들 때 흔히 발생하는 혼란의 원인입니다.
import pandas as pd
df = pd.DataFrame({
'product': ['Widget', 'Gadget'],
'version': [3, 5]
})
# Must convert int to str before concatenating
df['label'] = df['product'] + ' v' + df['version'].astype(str)
print(df['label'].tolist())
# ['Widget v3', 'Gadget v5']구분자로 결합하는 .str.cat()
Series.str.cat(others, sep=)은 여러 Series를 구분자와 함께 연결하는 Pandas 고유 방식이며, NaN 값도 안정적으로 처리합니다. 기본적으로 어느 열에든 NaN이 있으면 해당 행의 결과가 NaN이 됩니다. na_rep='?'(또는 임의의 문자열)를 전달하면 NaN을 그대로 전파하는 대신 자리 표시자로 바꿀 수 있습니다.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'city': ['NYC', 'LA', None],
'state': ['NY', None, 'TX'],
'country': ['USA', 'USA', 'USA']
})
# Join with ', ' — NaN rows produce NaN by default
df['location'] = df['city'].str.cat(
[df['state'], df['country']],
sep=', ',
na_rep='N/A'
)
print(df['location'].tolist())
# ['NYC, NY, USA', 'LA, N/A, USA', 'N/A, TX, USA']일관되지 않은 범주 레이블 정규화
실제 데이터의 범주 열에는 오타, 대소문자 차이 또는 서로 다른 약어(예: 'US', 'USA', '미국')로 인해 일관되지 않은 레이블이 포함되는 경우가 많습니다. 일반적인 해결 방법은 모든 변형을 표준 형식에 매핑하는 사전을 만든 다음 .map() 또는 .replace()로 적용하는 것입니다.
import pandas as pd
df = pd.DataFrame({
'country': ['US', 'USA', 'United States', 'uk', 'UK', 'United Kingdom']
})
canonical = {
'US': 'United States', 'USA': 'United States', 'United States': 'United States',
'uk': 'United Kingdom', 'UK': 'United Kingdom', 'United Kingdom': 'United Kingdom'
}
df['country_clean'] = df['country'].map(canonical)
print(df['country_clean'].tolist())
# ['United States', 'United States', 'United States',
# 'United Kingdom', 'United Kingdom', 'United Kingdom']공백 제거 및 대소문자 표준화
텍스트 열을 비교하거나 그룹화하기 전에는 항상 첫 번째 정리 단계로 공백을 제거하고 대소문자를 정규화해야 합니다. 사람에게는 같아 보이는 두 값(' 활성'과 '활성')도 앞의 공백과 대소문자 차이 때문에 Pandas에서는 서로 다른 값으로 처리됩니다. 공백을 제거한 다음 소문자로 변환하는 2단계 연결로 두 문제를 모두 해결할 수 있습니다.
import pandas as pd
df = pd.DataFrame({
'status': [' Active', 'INACTIVE', 'active ', ' Pending ', 'ACTIVE']
})
df['status_clean'] = df['status'].str.strip().str.lower()
print(df['status_clean'].value_counts())
# active 3
# inactive 1
# pending 1오타 수정을 위한 퍼지 매칭
오타 때문에 정확히 일치하는 항목을 찾을 수 없을 때는 퍼지 매칭으로 문자열 간 유사도 점수를 계산합니다. rapidfuzz 라이브러리(또는 기존의 fuzzywuzzy)는 벡터화된 퍼지 매칭을 제공합니다. 일반적인 작업 흐름은 각 고유한 정리 대상 값에 대해 유사도 임계값을 넘는 가장 가까운 표준 값을 찾고, 수정 매핑을 만드는 것입니다.
# Conceptual example (requires: pip install rapidfuzz)
from rapidfuzz import process
canonical_cities = ['New York', 'Los Angeles', 'Chicago', 'Houston']
dirty_values = ['New Yrok', 'Los Angelas', 'Chicagoo']
for dirty in dirty_values:
best, score, _ = process.extractOne(dirty, canonical_cities)
print(f'{dirty!r} -> {best!r} (score={score:.0f}%)')
# 'New Yrok' -> 'New York' (score=91%)
# 'Los Angelas'-> 'Los Angeles' (score=96%)
# 'Chicagoo' -> 'Chicago' (score=94%)explode()로 여러 값이 있는 셀 분할하기
셀에 구분자로 나뉜 여러 값이 들어 있는 경우가 있습니다(예: 'python,sql,pandas'). 열을 분할해 목록을 만든 다음 .explode()를 호출하면 값마다 하나의 행이 생성됩니다. 이렇게 하면 넓고 여러 값이 묶여 있는 셀이 각 행에 정확히 하나의 값만 포함하는 정돈된 긴 형식으로 변환됩니다. 이러한 값으로 groupby 및 조인 작업을 수행하려면 이 형식이 필요합니다.
import pandas as pd
df = pd.DataFrame({
'user_id': [1, 2, 3],
'skills': ['python,sql', 'java,kotlin,sql', 'python']
})
df['skills'] = df['skills'].str.split(',')
exploded = df.explode('skills')
print(exploded)
# user_id skills
# 0 1 python
# 0 1 sql
# 1 2 java
# 1 2 kotlin
# 1 2 sql
# 2 3 python텍스트의 혼합 인코딩 처리
서로 다른 원본에서 가져온 텍스트 데이터에는 인코딩 문제가 있을 수 있습니다. 예를 들어 \xa0(줄 바꿈 없는 공백), \u2019(곡선 아포스트로피), 깨진 악센트 문자가 이에 해당합니다. 빠르게 ASCII만 남기고 정리하려면 .str.encode('ascii', errors='replace').str.decode('ascii')를 사용하고, 악센트를 제거하기 전에 분해하려면 .str.normalize('NFKD')를 사용합니다.
import pandas as pd
import unicodedata
df = pd.DataFrame({'name': ['Caf\u00e9', 'na\u00efve', 'r\u00e9sum\u00e9']})
# Normalize and strip accents (NFKD decomposition + ascii encoding)
df['name_ascii'] = (
df['name']
.str.normalize('NFKD')
.str.encode('ascii', errors='ignore')
.str.decode('ascii')
)
print(df)
# name name_ascii
# 0 Cafe Cafe
# 1 naive naive
# 2 resume resume복합 키 만들기
많은 데이터세트에서는 조인이나 중복 제거를 위해 행을 고유하게 식별할 수 있도록 여러 열에서 복합 키를 만들어야 합니다. 정리된 문자열 열(공백 제거, 소문자 변환, 정규화)을 하나의 키 문자열로 결합하면, 같은 엔터티가 원본마다 조금씩 다르게 표기된 경우에도 데이터 원본 간에 일관되게 매칭할 수 있습니다.
import pandas as pd
df = pd.DataFrame({
'first': [' Alice', 'BOB', ' Carol'],
'last': ['Smith ', 'JONES', 'White '],
'dob': ['1990-01-15', '1985-07-22', '1992-11-30']
})
df['match_key'] = (
df['first'].str.strip().str.lower() + '|' +
df['last'].str.strip().str.lower() + '|' +
df['dob']
)
print(df['match_key'].tolist())
# ['alice|smith|1990-01-15', 'bob|jones|1985-07-22', 'carol|white|1992-11-30']표준 범주 목록 적용하기
정리한 후에는 범주형 텍스트 열의 모든 값이 알려진 표준 집합에 속하는지 확인해야 합니다. 집합에 없는 값은 새롭게 추가된 정상 범주일 수도 있고 데이터 오류일 수도 있습니다. 알 수 없는 값은 조용히 삭제하지 말고 수동 검토를 위해 기록하거나 표시해야 누락되는 항목이 없습니다.
import pandas as pd
df = pd.DataFrame({
'status': ['active', 'inactive', 'active', 'archived', 'unknown_status']
})
canonical = {'active', 'inactive', 'archived'}
unknown = df[~df['status'].isin(canonical)]['status'].unique()
print('Unknown statuses:', unknown.tolist())
# ['unknown_status']
# Flag unknown rows
df['status_valid'] = df['status'].isin(canonical)
print(df)전체 텍스트 정리 파이프라인
다음은 이 강의의 모든 기법을 적용하는 완전한 텍스트 정리 파이프라인입니다. 공백 제거, 대소문자 정규화, 약어 수정, 특수 문자 제거, 표준 목록과의 검증을 차례로 수행합니다. 이러한 재사용 가능한 함수는 어떤 데이터 수집 모듈에도 추가할 수 있습니다.
import pandas as pd
def clean_category_column(series, canonical_map, canonical_set):
cleaned = (
series
.str.strip()
.str.lower()
.map(lambda x: canonical_map.get(x, x)) # fix known variants
)
unknown = cleaned[~cleaned.isin(canonical_set)]
if not unknown.empty:
print('Warning: unknown values:', unknown.unique().tolist())
return cleaned
cmap = {'eng': 'engineering', 'hr': 'human_resources', 'mktg': 'marketing'}
cset = {'engineering', 'human_resources', 'marketing', 'finance'}
df = pd.DataFrame({'dept': ['Eng', 'HR', 'Marketing', 'MKTG', 'Legal']})
df['dept_clean'] = clean_category_column(df['dept'], cmap, cset)
print(df)빠른 확인
텍스트 열을 결합하고 정리하는 방법을 제대로 이해했는지 확인해 보세요.
강의 요약
이 강의에서는 숫자형을 문자열로 변환한 후 + 연산자로 열을 연결하고, str.cat(sep=)으로 구분자와 함께 결합하면서 NaN을 처리하는 방법을 배웠습니다. 또한 표준 매핑을 .map()으로 적용해 일관되지 않은 레이블을 정규화하고, explode()로 목록 값이 있는 셀을 여러 행으로 확장하는 방법도 배웠습니다. 표준 집합을 적용하면 데이터 품질 문제를 조기에 발견할 수 있습니다. 다음에는 열 값을 기준으로 DataFrames를 정렬합니다.
AI 튜터와 함께 Python을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 30
- 레슨
- 120
자주 묻는 질문
“텍스트 열 결합과 정리” 강의는 무료인가요?
네 — “텍스트 열 결합과 정리” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“텍스트 열 결합과 정리”에서 뭘 배우나요?
여러 열을 하나의 문자열로 연결하고 공백을 제거하며 일관되지 않은 범주 레이블을 정규화합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“텍스트 열 결합과 정리” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- .str 접근자
- 문자열 나누고 바꾸기
- 정규 표현식으로 패턴 찾기
- 텍스트 열 결합과 정리