Maison >développement back-end >Tutoriel Python >Comment diviser efficacement des chaînes séparées par des virgules dans des DataFrames Pandas ?

Comment diviser efficacement des chaînes séparées par des virgules dans des DataFrames Pandas ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-19 06:18:15933parcourir

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

Diviser les entrées de chaîne séparées par des virgules dans Pandas DataFrame

Les données d'entrée sont souvent structurées avec des valeurs séparées par des caractères tels que des virgules. Lorsque vous travaillez avec des dataframes Pandas, il devient nécessaire de diviser ces entrées de chaîne et de créer des lignes distinctes pour chaque valeur. Dans cet article, nous examinerons les méthodes disponibles pour atteindre cet objectif efficacement.

Utilisation de la méthode .explode() de Pandas

Introduit dans les versions 0.25.0 et 1.3.0 de Pandas, le La méthode .explode() offre une solution simple et efficace pour exploser des colonnes contenant des listes ou des tableaux. Il fonctionne à la fois sur des colonnes simples et multiples, offrant une flexibilité dans la gestion d'ensembles de données complexes.

Syntaxe :

dataframe.explode(column_name)

Exemple :

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)

Fonction vectorisée personnalisée pour exploser plusieurs colonnes

Pour des scénarios plus complexes lorsque l'éclatement de plusieurs colonnes est nécessaire, une fonction vectorisée personnalisée peut fournir une solution polyvalente :

Définition de la fonction :

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

Exemple :

# 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)

Transformation par regroupement

Une autre approche consiste à utiliser .transform() pour appliquer une fonction personnalisée qui divise les entrées de chaîne et crée de nouvelles lignes :

Fonction personnalisée :

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

Exemple :

# 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)

Conclusion

En fonction des exigences spécifiques et de la complexité de l'ensemble de données, différentes méthodes peuvent être utilisées pour diviser les entrées de chaîne séparées par des virgules dans les trames de données Pandas. L'utilisation de la méthode .explode() offre une approche simple et efficace, tandis que les fonctions vectorisées personnalisées offrent une flexibilité pour gérer des scénarios plus complexes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn