Maison > développement back-end > Tutoriel Python > Comment désimbriquer les colonnes contenant une liste dans les DataFrames Pandas ?

Comment désimbriquer les colonnes contenant une liste dans les DataFrames Pandas ?

Barbara Streisand
Libérer: 2024-12-20 22:58:14
original
899 Les gens l'ont consulté

How to Unnest List-Containing Columns in Pandas DataFrames?

Comment dissocier (exploser) une colonne dans un DataFrame Pandas, en plusieurs lignes

Dans les pandas, vous pouvez rencontrer des situations où une colonne contient des listes ou des objets en tant qu'éléments. Pour transformer une telle colonne en lignes individuelles, un processus appelé « désimbrication » ou « explosion » est nécessaire. Cela vous permet de visualiser et d'analyser les données plus efficacement.

Problème :

Considérez un DataFrame où l'une des colonnes, « B », contient des listes :

df = pd.DataFrame({'A': [1, 2], 'B': [[1, 2], [1, 2]]})

   A       B
0  1  [1, 2]
1  2  [1, 2]
Copier après la connexion

Résultat attendu :

Le résultat souhaité est un DataFrame où chaque élément de la colonne « B » est représenté sous la forme d'une ligne distincte :

   A  B
0  1  1
1  1  2
3  2  1
4  2  2
Copier après la connexion

Solution :

Méthode 1 : Fonction Explode

À partir de la version 0.25 de Pandas, vous pouvez utiliser la fonction pandas.DataFrame.explode pour désemboîtement. Cette fonction explose efficacement des colonnes spécifiques, créant de nouvelles lignes pour chaque élément de la liste.

df.explode('B')

   A  B
0  1  1
1  1  2
0  2  1
1  2  2
Copier après la connexion

Méthode 2 : Appliquer pd.Series

Une autre approche consiste à combiner l'application fonction avec pd.Series. Cette méthode traite chaque ligne de la colonne « B » et divise ses éléments en objets Series distincts.

df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})
Copier après la connexion

Méthode 3 : Constructeur DataFrame

Alternativement, vous pouvez utilisez le constructeur DataFrame pour remodeler les données. Cela implique de répéter les index des lignes pour correspondre au nombre d'éléments dans les listes et de les concaténer en une seule colonne.

df = pd.DataFrame({'A':df.A.repeat(df.B.str.len()), 'B':np.concatenate(df.B.values)})
Copier après la connexion

Méthode 4 : Réindexer ou loc

L'utilisation de reindex ou loc vous permet d'étendre le DataFrame pour accueillir les valeurs éclatées. Remplissez les valeurs manquantes avec les éléments de la colonne « B ».

df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))
Copier après la connexion

Méthode 5 : Compréhension de liste

Une méthode concise consiste à créer une liste de listes en utilisant compréhension de la liste puis sa conversion en DataFrame.

pd.DataFrame([[x] + [z] for x, y in df.values for z in y],columns=df.columns)
Copier après la connexion

Méthode 6 : Numpy

Pour les scénarios gourmands en performances, numpy propose des opérations vectorisées. Cette méthode remodèle les données à l'aide de np.dstack et crée un nouveau DataFrame.

newvalues=np.dstack((np.repeat(df.A.values,list(map(len,df.B.values))),np.concatenate(df.B.values)))
pd.DataFrame(data=newvalues[0],columns=df.columns)
Copier après la connexion

Méthode 7 : Itertools

En utilisant le package itertools, vous pouvez parcourir le éléments et combinez-les pour créer un nouveau DataFrame.

from itertools import cycle, chain
l=df.values.tolist()
l1=[list(zip([x[0]], cycle(x[1])) if len([x[0]]) > len(x[1]) else list(zip(cycle([x[0]]), x[1]))) for x in l]
pd.DataFrame(list(chain.from_iterable(l1)),columns=df.columns)
Copier après la connexion

Généralisation à plusieurs colonnes :

Pour étendre ces méthodes à plusieurs colonnes, vous pouvez définir une fonction personnalisée qui prend les noms de colonnes en entrée et effectue l'opération de dissociation.

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')
Copier après la connexion

Column-Wise Désemboîtement :

Si vous souhaitez "désemboîter" horizontalement, c'est-à-dire développer des éléments dans une rangée, vous pouvez utiliser le constructeur DataFrame.

df.join(pd.DataFrame(df.B.tolist(),index=df.index).add_prefix('B_'))
Copier après la connexion

Conclusion :

Ces méthodes offrent des options flexibles pour dissocier les données dans les DataFrames pandas. Choisissez l'approche qui correspond le mieux à vos exigences de performances et de lisibilité.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal