Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Memisahkan Rentetan Dipisahkan Koma dengan Cekap dalam Pandas DataFrames?

Bagaimana untuk Memisahkan Rentetan Dipisahkan Koma dengan Cekap dalam Pandas DataFrames?

Linda Hamilton
Linda Hamiltonasal
2024-12-19 06:18:15944semak imbas

How to Efficiently Split Comma-Separated Strings in Pandas DataFrames?

Memisahkan Entri Rentetan Dipisahkan Koma dalam Pandas DataFrame

Data input selalunya berstruktur dengan nilai yang dipisahkan oleh aksara seperti koma. Apabila bekerja dengan bingkai data Pandas, adalah perlu untuk memisahkan entri rentetan ini dan membuat baris berasingan untuk setiap nilai. Dalam artikel ini, kami akan menyelidiki kaedah yang tersedia untuk mencapai matlamat ini dengan cekap.

Menggunakan Kaedah .explode() Pandas

Diperkenalkan dalam Pandas versi 0.25.0 dan 1.3.0, Kaedah .explode() menawarkan penyelesaian yang mudah dan cekap untuk meletupkan lajur yang mengandungi senarai atau tatasusunan. Ia beroperasi pada kedua-dua lajur tunggal dan berbilang, memberikan fleksibiliti dalam mengendalikan set data kompleks.

Sintaks:

dataframe.explode(column_name)

Contoh:

import pandas as pd

# Dataframe with a column containing comma-separated values
df = pd.DataFrame({'var1': ['a,b,c', 'd,e,f'], 'var2': [1, 2]})

# Exploding the 'var1' column
df = df.explode('var1')

# Resulting dataframe with separate rows for each value
print(df)

Fungsi Vektor Tersuai untuk Berbilang Meletup Lajur

Untuk senario yang lebih kompleks di mana letupan berbilang lajur diperlukan, fungsi tersuai vektor boleh menyediakan penyelesaian serba boleh:

Fungsi Definisi:

def explode(df, lst_cols, fill_value='', preserve_index=False):
    # Calculate lengths of lists
    lens = df[lst_cols[0]].str.len()

    # Repeat values for non-empty lists
    res = (pd.DataFrame({
                col:np.repeat(df[col].values, lens)
                for col in df.columns.difference(lst_cols)},
                index=np.repeat(df.index.values, lens))
             .assign(**{col:np.concatenate(df.loc[lens>0, col].values)
                            for col in lst_cols}))

    # Append rows with empty lists
    if (lens == 0).any():
        res = (res.append(df.loc[lens==0, df.columns.difference(lst_cols)], sort=False)
                  .fillna(fill_value))

    # Revert index order and reset index if requested
    res = res.sort_index()
    if not preserve_index:
        res = res.reset_index(drop=True)
    return res

Contoh:

# Dataframe with multiple columns containing lists
df = pd.DataFrame({
    'var1': [['a', 'b'], ['c', 'd']],
    'var2': [['x', 'y'], ['z', 'w']]
})

# Exploding 'var1' and 'var2' columns
df = explode(df, ['var1', 'var2'])

# Resulting dataframe with separate rows for each list item
print(df)

Transforming by Grouping

Pendekatan lain melibatkan penggunaan .transform() untuk memohon fungsi tersuai yang memisahkan entri rentetan dan mencipta baharu baris:

Fungsi Tersuai:

def split_fun(row):
    return [row['var1'].split(',')]

Contoh:

# Dataframe with a column containing comma-separated values
df = pd.DataFrame({'var1': ['a,b,c', 'd,e,f'], 'var2': [1, 2]})

# Creating a new column with split values using transform
df['var1_split'] = df.transform(split_fun)

# Unnest the newly created column to separate rows
df = df.unnest('var1_split')

# Resulting dataframe with separate rows for each value
print(df)

Kesimpulan

Bergantung pada keperluan khusus dan kerumitan set data, kaedah yang berbeza boleh digunakan untuk memisahkan entri rentetan yang dipisahkan koma dalam bingkai data Pandas. Menggunakan kaedah .explode() menawarkan pendekatan yang mudah dan cekap, manakala fungsi vektor tersuai memberikan fleksibiliti untuk mengendalikan senario yang lebih kompleks.

Atas ialah kandungan terperinci Bagaimana untuk Memisahkan Rentetan Dipisahkan Koma dengan Cekap dalam Pandas DataFrames?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn