Maison > développement back-end > Tutoriel Python > Comment désimbriquer une colonne Pandas DataFrame en plusieurs lignes ?

Comment désimbriquer une colonne Pandas DataFrame en plusieurs lignes ?

Susan Sarandon
Libérer: 2024-12-21 00:47:09
original
507 Les gens l'ont consulté

How to Unnest a Pandas DataFrame Column into Multiple Rows?

Comment dissocier une colonne en plusieurs lignes dans un DataFrame Pandas

Problème :

Vous disposez d'un DataFrame dans lequel une colonne contient une liste de valeurs et vous souhaitez séparer chaque élément de la liste en son propre rangée.

Solution :

Il existe plusieurs méthodes pour désimbriquer (ou exploser) une colonne dans un Pandas DataFrame :

Méthode 1 : Utilisation d'exploser (Pandas >= 0,25)

Si vous avez un une seule colonne pour désimbriquer, la fonction d'éclatement est la solution la plus simple :

df.explode('B')
Copier après la connexion

Méthode 2 : Utiliser apply et pd.Series

Cette méthode est simple mais non recommandée pour des raisons de performances :

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 : Utilisation de la répétition et du DataFrame Constructeur

Créez un nouveau DataFrame avec les valeurs répétées dans la colonne non imbriquée :

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 : Utilisation de réindexation ou de loc

Créez un nouveau DataFrame avec les valeurs non imbriquées et utilisez réindexer ou loc pour l'aligner avec le original :

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

Méthode 5 : Utilisation de collections.ChainMap (lorsque la liste contient des valeurs uniques)

from collections import ChainMap
d = dict(ChainMap(*map(dict.fromkeys, df['B'], df['A'])))
pd.DataFrame(list(d.items()),columns=df.columns[::-1])
Copier après la connexion

Méthode 6 : Utilisation de Numpy pour High Performance

Cette méthode est plus efficace que la précédente ceux :

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 : Utiliser itertools.cycle et itertools.chain

Solution Python pure pour le plaisir :

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éraliser à plusieurs colonnes :

La fonction suivante vous permet de désimbriquer plusieurs colonnes dans un DataFrame :

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

Dissociation par colonne :

Si vous devez désimbriquer une colonne horizontalement, utilisez la méthode add_prefix du constructeur DataFrame :

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

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