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]
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
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
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'})
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)})
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))
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)
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)
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)
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')
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_'))
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!