python pandas numpy reshape

python - Remodelar de largo a ancho usando nombres de columnas



pandas numpy (5)

Hola, estoy teniendo problemas para remodelar mi df.

Yo tengo:

Netflix TV DVD 0.1 0.2 0.3 0.12 0.5 0.15 0.4 0.6 0.8 0.5 0.41 0.41 0.2

Y quiero convertir mi df para que se vea como:

Netflix [0.1, 0.12, 0.4] TV [0.2, 0.5, 0.6, 0.5, 0.41, 0.2] DVD [0.3, 0.15, 0.8, 0.41]

No estoy seguro de cómo stack () o pivot () funcionaría en un df de este tipo. Cualquier ayuda apreciada.


stack

El apilamiento deja caer valores nulos mientras se remodela la matriz

df.stack().groupby(level=1).agg(list) DVD [0.3, 0.15, 0.8, 0.41] Netflix [0.1, 0.12, 0.4] TV [0.2, 0.5, 0.6, 0.5, 0.41, 0.2] dtype: object


Creo que esto es lo que estás buscando:

> df.T.apply(lambda x: x.dropna().tolist(), axis=1) Netflix [0.1, 0.12, 0.4, 0.5, 0.41, 0.2] TV [0.2, 0.5, 0.6, 0.41] DVD [0.3, 0.15, 0.8] dtype: object


Elimine los valores perdidos por Series.dropna y Series.dropna a Series en la comprensión del diccionario:

s = pd.Series({x: df[x].dropna().tolist() for x in df.columns}) print (s) Netflix [0.1, 0.12, 0.4] TV [0.2, 0.5, 0.6, 0.5, 0.41, 0.2] DVD [0.3, 0.15, 0.8, 0.41] dtype: object

... o en DataFrame.apply :

s = df.apply(lambda x: x.dropna().tolist()) print (s) Netflix [0.1, 0.12, 0.4] TV [0.2, 0.5, 0.6, 0.5, 0.41, 0.2] DVD [0.3, 0.15, 0.8, 0.41] dtype: object

Último si necesita 2 columnas DataFrame :

df1 = s.rename_axis(''a'').reset_index(name=''b'') print (df1) a b 0 Netflix [0.1, 0.12, 0.4] 1 TV [0.2, 0.5, 0.6, 0.5, 0.41, 0.2] 2 DVD [0.3, 0.15, 0.8, 0.41]


Si los valores que faltan en cada columna son NaN, puede continuar con esto:

df1 = pd.DataFrame({ "Netflix": [0.1, 0.12, 0.4, None, None, None], "TV": [0.2, 0.5, 0.6, 0.5, 0.41, 0.2], "DVD": [0.3, 0.15, 0.8, 0.41, None, None] } ) print(df1) df2 = pd.DataFrame(df1.columns, columns=["Type"]) df2["List_for_Type"] = [ list(df1[f].dropna()) for f in df1.columns ] print(df2)

La salida correspondiente es:

Netflix TV DVD 0 0.10 0.20 0.30 1 0.12 0.50 0.15 2 0.40 0.60 0.80 3 NaN 0.50 0.41 4 NaN 0.41 NaN 5 NaN 0.20 NaN Type List_for_Type 0 Netflix [0.1, 0.12, 0.4] 1 TV [0.2, 0.5, 0.6, 0.5, 0.41, 0.2] 2 DVD [0.3, 0.15, 0.8, 0.41]

Espero que esto ayude.


Usando groupby con columns

df.groupby(level=0,axis=1).apply(lambda x : x.dropna().iloc[:,0].tolist()) Out[20]: DVD [0.3, 0.15, 0.8, 0.41] Netflix [0.1, 0.12, 0.4] TV [0.2, 0.5, 0.6, 0.5, 0.41, 0.2] dtype: object