Dzielenie i zastępowanie tekstu
Podziel teksty na wiele kolumn za pomocą .str.split(expand=True) i zastępuj fragmenty tekstu metodą .str.replace().
Dzielenie i zastępowanie tekstu to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Dzielenie napisów na listę
.str.split(sep) dzieli każdy napis w obiekcie Series przy każdym wystąpieniu separatora i zwraca obiekt Series zawierający listy. Bez expand=True każdy element jest listą Pythona, co jest przydatne do zliczania tokenów lub dalszego przetwarzania na poziomie listy. Separator może być dosłownym napisem albo wzorcem wyrażenia regularnego.
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 — dzielenie na kolumny
Przekazanie expand=True do .str.split() zwraca obiekt DataFrame zamiast obiektu Series zawierającego listy. Każdy rozdzielony token trafia do osobnej kolumny (kolumna 0, 1, 2, …). Jest to standardowy sposób rozszerzania kolumny z ogranicznikami — na przykład podziału pełnego imienia i nazwiska „first last” na osobne kolumny imienia i nazwiska.
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 WhiteOgraniczanie liczby podziałów za pomocą n=
Parametr n ogranicza maksymalną liczbę podziałów. .str.split(sep, n=1) dzieli napis najwyżej raz, tworząc najwyżej dwie części. Jest to przydatne, gdy potrzebują Państwo tylko pierwszego składnika napisu, a reszta może pozostać razem — na przykład podczas wyodrębniania domeny z adresu e-mail przez podział przy '@'.
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.netrsplit() — dzielenie od prawej strony
.str.rsplit(sep, n=1) dzieli napis od jego prawej strony. Jest to przydatne, gdy chcą Państwo uzyskać ostatni składnik — na przykład wyodrębnić rozszerzenie pliku ze ścieżki, dzieląc ją przy ostatniej kropce. W połączeniu z expand=True tworzy dwie kolumny: wszystko przed ostatnim separatorem oraz wszystko po nim.
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() — zastępowanie fragmentów napisów
.str.replace(pat, repl) zastępuje wystąpienia wzorca w każdym napisie. Domyślnie parametr pat jest traktowany jako wyrażenie regularne, dlatego w przypadku zastępowania dosłownego napisu należy przekazać regex=False. Zastąpienie może być stałym napisem albo odwołaniem wstecznym wyrażenia regularnego. Do wektorowego zastępowania należy zawsze używać tej metody zamiast pętli w Pythonie.
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.75Zastępowanie za pomocą wzorców wyrażeń regularnych
Po przekazaniu regex=True (wartość domyślna) wzorzec jest wyrażeniem regularnym, a zastąpienie może zawierać odwołania wsteczne, takie jak r'\1', odnoszące się do przechwyconych grup. Umożliwia to zaawansowane przekształcenia tekstu, takie jak zmiana formatu dat, normalizacja numerów telefonów czy wyodrębnianie ustrukturyzowanych danych z tekstu swobodnego.
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-04Zliczanie wykonanych zastąpień
Czasami warto sprawdzić, ile wartości rzeczywiście zmieniło się w wyniku zastąpienia. Należy porównać oryginalny obiekt Series z obiektem po zastąpieniu i zliczyć wiersze, w których wystąpiła zmiana. Ten krok walidacji potwierdza, że wzorzec zastąpienia zadziałał zgodnie z oczekiwaniami, i pomaga wcześnie wykryć błędy w wyrażeniu regularnym.
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']Zastępowanie wielu wzorców za pomocą pętli
Gdy trzeba zastosować wiele zastąpień (np. ujednolicić dziesiątki skrótów), należy przeiterować po słowniku mapowania i zastosować każde zastąpienie po kolei. Jest to łatwiejsze w utrzymaniu niż jedno złożone wyrażenie regularne z alternatywami. Mapowanie należy utworzyć na podstawie reguł biznesowych lub tabeli wyszukiwania.
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']Łączenie z powrotem podzielonych części
Po podziale może być konieczne ponowne połączenie części. W przypadku obiektu Series zawierającego listy należy użyć .str.join(separator), aby połączyć elementy listy w jeden napis dla każdego wiersza. Do łączenia wartości z wielu kolumn należy użyć standardowej konkatenacji napisów za pomocą + i .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-bazNormalizacja białych znaków
Typowym zadaniem podczas czyszczenia tekstu jest zastąpienie wielu następujących po sobie spacji pojedynczą spacją. Często zdarza się to w tekście pobranym ze stron internetowych, gdy odstępy w kodzie HTML lub kopiowanie i wklejanie dodają zbędne białe znaki. Wzorzec wyrażenia regularnego r'\s+' dopasowuje jeden lub więcej białych znaków i zastępuje je pojedynczą spacją, a następnie .str.strip() usuwa spacje z początku i końca.
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']Praktyka: analizowanie kolumny z ustrukturyzowanymi napisami
Oto realistyczny przykład, w którym jedna kolumna zawiera ustrukturyzowane dane, takie jak 'Alice:25:Engineer'. Dzielimy wartości przy separatorze, nadajemy wynikowym kolumnom nazwy i konwertujemy każdą z nich na odpowiedni typ — jest to kompletny potok analizowania i konwersji typów, wykorzystujący wyłącznie .str.split() oraz 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 AnalystSzybkie sprawdzenie
Sprawdź swoją wiedzę na temat dzielenia i zastępowania napisów.
Podsumowanie lekcji
W tej lekcji nauczyli się Państwo, że: str.split(sep, expand=True) rozszerza kolumnę z ogranicznikami na wiele kolumn, n= ogranicza liczbę podziałów, str.rsplit() dzieli od prawej strony, a str.replace() zastępuje wzorce (z obsługą wyrażeń regularnych). Można łączyć operacje dzielenia i zastępowania z strip oraz lower, aby tworzyć kompletne potoki normalizacji tekstu. W następnej części użyjemy wzorców wyrażeń regularnych do wyodrębniania i dopasowywania fragmentów napisów.
Często zadawane pytania
Czy lekcja „Dzielenie i zastępowanie tekstu” jest bezpłatna?
Tak — pełny tekst „Dzielenie i zastępowanie tekstu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Dzielenie i zastępowanie tekstu”?
Podziel teksty na wiele kolumn za pomocą .str.split(expand=True) i zastępuj fragmenty tekstu metodą .str.replace(). Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?
Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Dzielenie i zastępowanie tekstu”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?
Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Akcesor .str
- Dzielenie i zastępowanie tekstu
- Dopasowywanie wzorców za pomocą wyrażeń regularnych
- Łączenie i czyszczenie kolumn tekstowych