Maison >développement back-end >Tutoriel Python >Comment diviser efficacement des chaînes séparées par des virgules dans des DataFrames Pandas ?
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.
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)
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)
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)
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!