Maison >développement back-end >Tutoriel Python >Comment dissocier les colonnes de liste dans les Pandas DataFrames ?

Comment dissocier les colonnes de liste dans les Pandas DataFrames ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-30 19:21:10297parcourir

How to Unnest List Columns in Pandas DataFrames?

Dissocier les colonnes avec Pandas

Lorsque vous traitez des DataFrames qui contiennent des colonnes de listes, il peut être utile de "déplier" ces listes en lignes séparées.

Méthode 1 : Utilisation de DataFrame.explode() (Pandas >= 0.25)

Pour une explosion sur une seule colonne, utilisez explosive() directement :

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

df_exploded = df.explode('B')

Méthode 2 : appliquer la série

df_exploded = df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})

Méthode 3 : répéter le DataFrame

df_exploded = pd.DataFrame({'A':df.A.repeat(df.B.str.len()),'B':np.concatenate(df.B.values)})

Méthode 4 : Réindexer/Loc

df_exploded = df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))

Méthode 5 : ChainMap

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

Méthode 6 : Numpy

newvalues=np.dstack((np.repeat(df.A.values,list(map(len,df.B.values))),np.concatenate(df.B.values)))
df_exploded = pd.DataFrame(data=newvalues[0],columns=df.columns)

Méthode 7 : Itérateurs

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]
df_exploded = pd.DataFrame(list(chain.from_iterable(l1)),columns=df.columns)

Généralisation à plusieurs colonnes

Pour généraliser ce qui précède méthodes pour plusieurs colonnes, utilisez la fonction suivante :

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 Unnesting

Pour dissocier horizontalement, modifiez la fonction :

def unnesting(df, explode, axis):
    if axis==1:
        # Previous implementation
    else :
        df1 = pd.concat([
                         pd.DataFrame(df[x].tolist(), index=df.index).add_prefix(x) for x in explode], axis=1)
        return df1.join(df.drop(explode, 1), how='left')

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:
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
Article précédent:Celui des motsArticle suivant:Celui des mots