0Pricing
Pandas & NumPy Academy · 강의

문자열 나누고 바꾸기

.str.split(expand=True)으로 문자열을 여러 열로 나누고 .str.replace()로 부분 문자열을 바꿉니다.

문자열 나누고 바꾸기은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

문자열을 목록으로 분할하기

.str.split(sep)은 Series의 각 문자열을 구분자의 모든 출현 위치에서 분할하고, 목록으로 이루어진 Series를 반환합니다. expand=True를 지정하지 않으면 각 요소는 Python 목록이 되므로, 토큰을 세거나 목록 수준에서 추가 처리를 수행할 때 유용합니다. 구분자는 리터럴 문자열이나 정규식 패턴일 수 있습니다.

import pandas as pd

df = pd.DataFrame({'tags': ['python,data,pandas', 'ml,ai', 'sql,db,query']})

# Split into a list of strings
df['tag_list'] = df['tags'].str.split(',')
print(df['tag_list'])
# 0    [python, data, pandas]
# 1                  [ml, ai]
# 2         [sql, db, query]

# Count tags per row
df['tag_count'] = df['tag_list'].str.len()
print(df['tag_count'].tolist())  # [3, 2, 3]

expand=True로 열로 분할하기

expand=True를 .str.split()에 전달하면 목록으로 이루어진 Series 대신 DataFrame이 반환됩니다. 이때 분할된 각 토큰이 각자의 열(열 0, 1, 2, …)이 됩니다. 이는 구분자로 나뉜 열을 여러 열로 확장하는 표준적인 방법입니다. 예를 들어 'first last'라는 전체 이름을 이름과 성 열로 나눌 수 있습니다.

import pandas as pd

df = pd.DataFrame({'full_name': ['Alice Smith', 'Bob Jones', 'Carol White']})

# Split into two columns
name_parts = df['full_name'].str.split(' ', expand=True)
name_parts.columns = ['first_name', 'last_name']
df = pd.concat([df, name_parts], axis=1)
print(df)
#     full_name first_name last_name
# 0  Alice Smith      Alice     Smith
# 1    Bob Jones        Bob     Jones
# 2  Carol White      Carol     White

n=으로 분할 횟수 제한하기

n 매개변수는 최대 분할 횟수를 제한합니다. .str.split(sep, n=1)은 최대 한 번만 분할하므로 최대 두 부분이 만들어집니다. 문자열의 첫 번째 구성 요소만 필요하고 나머지는 하나로 유지해도 될 때 유용합니다. 예를 들어 '@'에서 분할하여 이메일에서 도메인을 추출할 수 있습니다.

import pandas as pd

df = pd.DataFrame({'email': ['alice@example.com', 'bob@work.org', 'carol@test.net']})

# Split at '@', keep only the first split
parts = df['email'].str.split('@', n=1, expand=True)
df['username'] = parts[0]
df['domain'] = parts[1]
print(df[['username', 'domain']])
#   username       domain
# 0    alice  example.com
# 1      bob     work.org
# 2    carol     test.net

오른쪽부터 분할하는 rsplit()

.str.rsplit(sep, n=1)은 문자열의 오른쪽부터 분할합니다. 마지막 구성 요소가 필요할 때 유용합니다. 예를 들어 경로를 마지막 마침표에서 분할하여 파일 확장자를 추출할 수 있습니다. expand=True와 함께 사용하면 두 개의 열이 만들어집니다. 하나에는 마지막 구분자 앞의 모든 내용이, 다른 하나에는 그 뒤의 모든 내용이 들어갑니다.

import pandas as pd

df = pd.DataFrame({'filepath': ['data/raw/sales.csv', 'data/clean/orders.xlsx', 'reports/q1.pdf']})

# Split on the last '/' to separate directory from filename
parts = df['filepath'].str.rsplit('/', n=1, expand=True)
df['directory'] = parts[0]
df['filename'] = parts[1]
print(df[['directory', 'filename']])
#     directory    filename
# 0    data/raw   sales.csv
# 1  data/clean  orders.xlsx
# 2     reports       q1.pdf

부분 문자열을 바꾸는 .str.replace()

.str.replace(pat, repl)은 각 문자열에서 패턴이 나타나는 부분을 바꿉니다. 기본적으로 pat은 정규 표현식으로 처리되므로, 리터럴 문자열을 바꾸려면 regex=False를 전달하세요. 교체 값은 고정 문자열이나 정규식 역참조일 수 있습니다. Python 반복문 대신 벡터화된 교체를 수행할 때는 항상 이 방법을 사용하세요.

import pandas as pd

df = pd.DataFrame({'price': ['$1,200.50', '$800.00', '$3,450.75']})

# Remove dollar sign and commas
df['price_clean'] = (
    df['price']
    .str.replace('$', '', regex=False)  # literal $
    .str.replace(',', '', regex=False)  # literal comma
)
df['price_float'] = df['price_clean'].astype(float)
print(df)
#       price price_clean  price_float
# 0  $1,200.50    1200.50       1200.5
# 1    $800.00     800.00        800.0
# 2  $3,450.75    3450.75       3450.75

정규식 패턴으로 바꾸기

regex=True(기본값)를 전달하면 패턴이 정규 표현식으로 처리되며, 교체 값에 r'\1'과 같은 역참조를 포함하여 캡처된 그룹을 참조할 수 있습니다. 이를 통해 날짜 형식 변경, 전화번호 정규화, 자유 형식 텍스트에서 구조화된 데이터 추출과 같은 강력한 텍스트 변환을 수행할 수 있습니다.

import pandas as pd

df = pd.DataFrame({'date': ['01-15-2024', '03-20-2024', '07-04-2024']})

# Reformat from MM-DD-YYYY to YYYY-MM-DD using groups
df['date_iso'] = df['date'].str.replace(
    r'(\d{2})-(\d{2})-(\d{4})',
    r'\3-\1-\2',
    regex=True
)
print(df)
#          date   date_iso
# 0  01-15-2024  2024-01-15
# 1  03-20-2024  2024-03-20
# 2  07-04-2024  2024-07-04

수행된 교체 횟수 세기

교체 작업으로 실제로 몇 개의 값이 수정되었는지 확인해야 할 때가 있습니다. 원래 Series와 교체된 Series를 비교하여 변경이 발생한 행의 수를 세면 됩니다. 이 검증 단계는 교체 패턴이 예상대로 일치했는지 확인하고 정규식 오류를 조기에 발견하는 데 도움이 됩니다.

import pandas as pd

df = pd.DataFrame({'text': ['foo bar', 'hello foo', 'world', 'foo foo']})

original = df['text'].copy()
df['text'] = df['text'].str.replace('foo', 'baz', regex=False)

changed = (df['text'] != original).sum()
print(f'{changed} rows were modified')  # 3
print(df['text'].tolist())
# ['baz bar', 'hello baz', 'world', 'baz baz']

반복문으로 여러 패턴 바꾸기

여러 교체 작업이 필요할 때(예: 수십 개의 약어를 표준화할 때)는 매핑 사전을 반복하면서 각 교체를 순서대로 적용하세요. 이는 복잡한 정규식 대안을 하나 사용하는 것보다 유지 관리하기 쉽습니다. 업무 규칙이나 조회 테이블에서 매핑을 구성할 수 있습니다.

import pandas as pd

df = pd.DataFrame({'dept': ['Eng', 'Engg', 'HR', 'Human Resources', 'Mktg', 'Marketing']})

# Standardisation map
substitutions = {
    'Engg': 'Engineering',
    'Eng': 'Engineering',
    'Human Resources': 'HR',
    'Mktg': 'Marketing'
}

for old, new in substitutions.items():
    df['dept'] = df['dept'].str.replace(old, new, regex=False)

print(df['dept'].tolist())
# ['Engineering', 'Engineering', 'HR', 'HR', 'Marketing', 'Marketing']

분할된 부분을 다시 결합하기

분할한 후에는 각 부분을 다시 결합해야 할 수 있습니다. 목록으로 이루어진 Series에는 .str.join(separator)을 사용하여 목록 요소를 행마다 하나의 문자열로 연결하세요. 여러 열의 값을 결합할 때는 +와 .astype(str)을 사용하는 표준 문자열 연결 방식을 이용하세요.

import pandas as pd

df = pd.DataFrame({'parts': [['alpha', 'beta'], ['foo', 'bar', 'baz']]})

# Join list elements with a hyphen
df['joined'] = df['parts'].str.join('-')
print(df['joined'])
# 0     alpha-beta
# 1  foo-bar-baz

공백 정규화하기

텍스트 정리에서 흔히 수행하는 작업은 연속된 여러 공백을 하나의 공백으로 줄이는 것입니다. HTML의 공백 처리나 복사하여 붙여넣는 과정에서 여분의 공백이 추가되는 웹 수집 텍스트에서 자주 발생합니다. 정규식 패턴 r'\s+'은 하나 이상의 공백 문자를 찾아 모두 하나의 공백으로 바꾸며, 이어서 .str.strip()이 앞뒤 공백을 제거합니다.

import pandas as pd

df = pd.DataFrame({'address': ['123  Main   St', '  456 Oak  Ave  ', '789 Pine St']})

df['address_clean'] = (
    df['address']
    .str.replace(r'\s+', ' ', regex=True)
    .str.strip()
)
print(df['address_clean'].tolist())
# ['123 Main St', '456 Oak Ave', '789 Pine St']

실전: 구조화된 문자열 열 파싱하기

하나의 열에 'Alice:25:Engineer'와 같은 구조화된 데이터가 들어 있는 실제 예를 살펴보겠습니다. 구분자로 분할하고, 결과 열의 이름을 지정한 다음, 각 열을 적절한 형식으로 변환합니다. .str.split()과 astype()만으로 완전한 파싱 및 형식 변환 파이프라인을 구성하는 방법입니다.

import pandas as pd

df = pd.DataFrame({'record': ['Alice:25:Engineer', 'Bob:34:Manager', 'Carol:28:Analyst']})

parts = df['record'].str.split(':', expand=True)
parts.columns = ['name', 'age', 'role']
parts['age'] = parts['age'].astype(int)

result = pd.concat([df, parts], axis=1)
print(result)
#              record   name  age      role
# 0  Alice:25:Engineer  Alice   25  Engineer
# 1    Bob:34:Manager    Bob   34   Manager
# 2  Carol:28:Analyst  Carol   28   Analyst

빠른 확인

문자열 분할과 교체에 대한 이해도를 확인해 보세요.

수업 요약

이번 수업에서는 다음을 배웠습니다. str.split(sep, expand=True)은 구분자로 나뉜 열을 여러 열로 확장하고, n=은 분할 횟수를 제한하며, str.rsplit()은 오른쪽부터 분할하고, str.replace()는 패턴을 교체합니다(정규식 지원 포함). split 및 replace 연산을 strip, lower와 연결하여 완전한 텍스트 정규화 파이프라인을 만들 수 있습니다. 다음에는 정규식 패턴을 사용하여 부분 문자열을 추출하고 일치 여부를 확인합니다.

자주 묻는 질문

“문자열 나누고 바꾸기” 강의는 무료인가요?

네 — “문자열 나누고 바꾸기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“문자열 나누고 바꾸기”에서 뭘 배우나요?

.str.split(expand=True)으로 문자열을 여러 열로 나누고 .str.replace()로 부분 문자열을 바꿉니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“문자열 나누고 바꾸기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. .str 접근자
  2. 문자열 나누고 바꾸기
  3. 정규 표현식으로 패턴 찾기
  4. 텍스트 열 결합과 정리
← Pandas & NumPy Academy(으)로 돌아가기