Explorer (diviser) les entrées de chaîne du DataFrame Pandas dans des lignes séparées
Dans Pandas, une exigence courante consiste à diviser les valeurs séparées par des virgules dans un colonne de chaîne de texte et créez une nouvelle ligne pour chaque entrée. Ceci peut être réalisé par diverses méthodes.
En utilisant Series.explode() ou DataFrame.explode()
Pour les versions Pandas 0.25.0 et supérieures, la série. Les méthodes éclater() et DataFrame.explode() fournissent un moyen pratique d'exploser des colonnes de type CSV :
Pour un seul colonnes :
df.explode('column_name')
Pour plusieurs colonnes :
df.explode(['column1', 'column2']) # Pandas 1.3.0
Générique Vectorisé Function
Une approche vectorisée plus polyvalente qui fonctionne à la fois pour les colonnes normales et de liste est fournie ci-dessous :
def explode(df, lst_cols, fill_value='', preserve_index=False): # Convert CSV string columns to list columns for col in lst_cols: df[col] = df[col].str.split(',') # Extract all non-list columns idx_cols = df.columns.difference(lst_cols) # Calculate list lengths lens = df[lst_cols[0]].str.len() # Create exploded DataFrame result = (pd.DataFrame({ col: np.repeat(df[col].values, lens) for col in idx_cols }, index=np.repeat(df.index.values, lens)) .assign(**{col: np.concatenate(df.loc[lens>0, col].values) for col in lst_cols})) # Handle empty list rows if (lens == 0).any(): result = result.append(df.loc[lens==0, idx_cols], sort=False).fillna(fill_value) # Revert index order and reset index if requested result = result.sort_index() if not preserve_index: result = result.reset_index(drop=True) return result
Applications
Colonne CSV :
df['var1'] = df['var1'].str.split(',')
Colonnes de liste multiples :
explode(df, ['num', 'text'], fill_value='')
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3