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
541 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!

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