Pandas & NumPy Academy · Oppitunti

Merkkijonojen jakaminen ja korvaaminen

Jakakaa merkkijonot useiksi sarakkeiksi .str.split(expand=True)-menetelmällä ja korvatkaa osamerkkijonoja .str.replace()-menetelmällä.

Oppitunti 2/413 vaihetta

Merkkijonojen jakaminen ja korvaaminen on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Pandas & NumPy Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Merkkijonojen jakaminen luetteloksi

.str.split(sep) jakaa Series-olion jokaisen merkkijonon erottimen jokaisen esiintymän kohdalta ja palauttaa luetteloita sisältävän Series-olion. Ilman expand=True jokaiseen alkioon tulee Python-luettelo, mikä on hyödyllistä tunnisteiden laskemiseen tai luettelotason jatkokäsittelyyn. Erotin voi olla literaalinen merkkijono tai regex-kuvio.

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 jakamista varten sarakkeisiin

Kun välität expand=True-parametrin kutsulle .str.split(), tuloksena on DataFrame luetteloita sisältävän Series-olion sijaan. Tällöin jokainen jaettu osa sijoitetaan omaan sarakkeeseensa (sarakkeet 0, 1, 2, …). Tämä on vakiotapa leventää erotinmerkillä rajattu sarake — esimerkiksi jakaa koko nimi 'first last' erillisiksi etu- ja sukunimisarakkeiksi.

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

Jaokertojen rajoittaminen parametrilla n=

n-parametri rajoittaa jakojen enimmäismäärää. .str.split(sep, n=1) jakaa merkkijonon enintään kerran, jolloin osia syntyy enintään kaksi. Tästä on hyötyä, kun tarvitsette vain merkkijonon ensimmäisen osan ja loput voivat jäädä yhteen — esimerkiksi sähköpostiosoitteen verkkotunnuksen poimimisessa jakamalla merkin '@' kohdalta.

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() jakamiseen oikealta

.str.rsplit(sep, n=1) jakaa merkkijonon oikealta. Tästä on hyötyä, kun haluatte viimeisen osan — esimerkiksi tiedostopäätteen poimimisessa polusta jakamalla viimeisen pisteen kohdalta. Yhdessä parametrin expand=True kanssa se muodostaa kaksi saraketta: kaiken ennen viimeistä erotinta ja kaiken sen jälkeen.

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() osamerkkijonon korvaamiseen

.str.replace(pat, repl) korvaa kuvion esiintymät jokaisessa merkkijonossa. Oletusarvoisesti pat tulkitaan säännölliseksi lausekkeeksi, joten välittäkää regex=False, jos haluatte korvata literaalisen merkkijonon. Korvaava arvo voi olla kiinteä merkkijono tai regex-viittaus. Käyttäkää tätä vektorisoituun korvaamiseen Python-silmukan sijaan.

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

Korvaaminen regex-kuvioilla

Kun välitätte parametrin regex=True (oletusarvo), kuvio on säännöllinen lauseke ja korvaava merkkijono voi sisältää taaksepäinviittauksia, kuten r'\1', joilla viitataan kaapattuihin ryhmiin. Tämä mahdollistaa tehokkaat tekstimuunnokset, kuten päivämäärien muotoilun, puhelinnumeroiden yhtenäistämisen tai rakenteisen datan poimimisen vapaamuotoisesta tekstistä.

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

Tehtyjen korvausten laskeminen

Joskus haluatte varmistaa, kuinka monta arvoa korvaus todella muutti. Verratkaa alkuperäistä ja korvattua Series-oliota ja laskekaa rivit, joilla tapahtui muutos. Tämä tarkistus varmistaa, että korvauskuvio osui odotetusti, ja auttaa havaitsemaan regex-virheet ajoissa.

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']

Useiden kuvioiden korvaaminen silmukalla

Kun tarvitsette useita korvauksia (esimerkiksi kymmenien lyhenteiden yhtenäistämiseen), käykää läpi määrityssanakirja silmukalla ja tehkää kukin korvaus peräkkäin. Tämä on ylläpidettävämpi ratkaisu kuin yksi monimutkainen regex-vaihtoehtolauseke. Muodostakaa määritykset liiketoimintasäännöistä tai hakutaulukosta.

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']

Jaettujen osien yhdistäminen takaisin

Jakamisen jälkeen osat täytyy ehkä yhdistää uudelleen. Käyttäkää luetteloita sisältävälle Series-oliolle .str.join(separator)-metodia, joka yhdistää luettelon alkiot yhdeksi merkkijonoksi kullakin rivillä. Kun yhdistätte arvoja sarakkeiden välillä, käyttäkää tavallista merkkijonojen yhdistämistä operaattorilla + ja muuntakaa arvot tarvittaessa merkkijonoiksi komennolla .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

Tyhjien merkkien yhtenäistäminen

Yleinen tekstin puhdistustehtävä on tiivistää useat peräkkäiset välilyönnit yhdeksi välilyönniksi. Tätä esiintyy usein verkkosivuilta kaapatussa tekstissä, jossa HTML:n välit tai kopiointi lisää ylimääräisiä tyhjiä merkkejä. Regex-kuvio r'\s+' vastaa yhtä tai useampaa tyhjää merkkiä ja korvaa ne kaikki yhdellä välilyönnillä. Tämän jälkeen .str.strip() poistaa alusta ja lopusta mahdolliset välilyönnit.

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']

Käytännössä: rakenteisen merkkijonosarakkeen jäsentäminen

Tässä on realistinen esimerkki, jossa yksi sarake sisältää rakenteista dataa, kuten 'Alice:25:Engineer'. Jaamme arvot erottimen kohdalta, nimeämme tuloksena syntyvät sarakkeet ja muunnamme jokaisen oikeaan tyyppiin — kokonainen jäsennys- ja tyyppimuunnosputki, jossa käytetään vain komentoja .str.split() ja 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

Pikatarkistus

Testatkaa, miten hyvin ymmärrätte merkkijonojen jakamista ja korvaamista.

Oppitunnin yhteenveto

Tässä oppitunnissa opitte, että str.split(sep, expand=True) leventää erotinmerkillä rajatun sarakkeen useiksi sarakkeiksi, n= rajoittaa jakojen määrää, str.rsplit() jakaa oikealta ja str.replace() korvaa kuvioita (myös regex-kuvioita). Ketjuttamalla jakamis- ja korvausoperaatioita strip- ja lower-operaatioiden kanssa voitte rakentaa kokonaisia tekstin normalisointiputkia. Seuraavaksi käytämme regex-kuvioita osamerkkijonojen poimintaan ja etsimiseen.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”Merkkijonojen jakaminen ja korvaaminen” ilmainen?

Kyllä – oppitunnin ”Merkkijonojen jakaminen ja korvaaminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Pandas & NumPy Academy-kurssin, päivitä CoddyKit PROhon. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Merkkijonojen jakaminen ja korvaaminen”?

Jakakaa merkkijonot useiksi sarakkeiksi .str.split(expand=True)-menetelmällä ja korvatkaa osamerkkijonoja .str.replace()-menetelmällä. Harjoittelet Pandas & NumPy Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Pandas & NumPy Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Pandas & NumPy Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Merkkijonojen jakaminen ja korvaaminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Pandas & NumPy Academy-oppitunnilla?

Kyllä. Jokainen Pandas & NumPy Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. .str-aksesori
  2. Merkkijonojen jakaminen ja korvaaminen
  3. Kuvioiden haku säännöllisillä lausekkeilla
  4. Tekstisarakkeiden yhdistäminen ja siistiminen
← Takaisin: Pandas & NumPy Academy