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