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.
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')
df_exploded = df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'})
df_exploded = pd.DataFrame({'A':df.A.repeat(df.B.str.len()),'B':np.concatenate(df.B.values)})
df_exploded = df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values))
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])
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)
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)
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')
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!