usar tutorial tablas para panda leer funciones documentacion datos data curso como comandos cleaning python pandas reshape

tutorial - funciones panda python



Pandas de largo a ancho remodelado, por dos variables (5)

Aquí hay otra solución más completa, tomada del sitio de Chris Albon .

Crear un marco de datos "largo"

raw_data = {''patient'': [1, 1, 1, 2, 2], ''obs'': [1, 2, 3, 1, 2], ''treatment'': [0, 1, 0, 1, 0], ''score'': [6252, 24243, 2345, 2342, 23525]} df = pd.DataFrame(raw_data, columns = [''patient'', ''obs'', ''treatment'', ''score''])

Hacer un dato "ancho"

df.pivot(index=''patient'', columns=''obs'', values=''score'')

Tengo datos en formato largo y estoy tratando de remodelar a lo ancho, pero no parece haber una forma sencilla de hacerlo usando derretir / apilar / desapilar

Salesman Height product price Knut 6 bat 5 Knut 6 ball 1 Knut 6 wand 3 Steve 5 pen 2

Se convierte en

Salesman Height product_1 price_1 product_2 price_2 product_3 price_3 Knut 6 bat 5 ball 1 wand 3 Steve 5 pen 2 NA NA NA NA

Creo que Stata puede hacer algo como esto con el comando remodelar.


Remodelando documentos están here

Está buscando pd.wide_to_long() (que es el análogo directo del comando stata)


Un poco viejo pero lo publicaré para otras personas.

Lo que desea puede lograrse, pero probablemente no debería desearlo;) Pandas admite índices jerárquicos tanto para filas como para columnas. En Python 2.7.x ...

from StringIO import StringIO raw = ''''''Salesman Height product price Knut 6 bat 5 Knut 6 ball 1 Knut 6 wand 3 Steve 5 pen 2'''''' dff = pd.read_csv(StringIO(raw), sep=''/s+'') print dff.set_index([''Salesman'', ''Height'', ''product'']).unstack(''product'')

Produce una representación probablemente más conveniente de lo que buscabas

price product ball bat pen wand Salesman Height Knut 6 1 5 NaN 3 Steve 5 NaN NaN 2 NaN

La ventaja de usar set_index y desapilar frente a una función única como pivote es que puede dividir las operaciones en pequeños pasos claros, lo que simplifica la depuración.


Un simple pivote podría ser suficiente para sus necesidades, pero esto es lo que hice para reproducir su salida deseada:

df[''idx''] = df.groupby(''Salesman'').cumcount()

Simplemente agregando un contador / índice dentro del grupo obtendrá la mayor parte del camino, pero las etiquetas de las columnas no serán las que usted desea:

print df.pivot(index=''Salesman'',columns=''idx'')[[''product'',''price'']] product price idx 0 1 2 0 1 2 Salesman Knut bat ball wand 5 1 3 Steve pen NaN NaN 2 NaN NaN

Para acercarme a la salida deseada, agregué lo siguiente:

df[''prod_idx''] = ''product_'' + df.idx.astype(str) df[''prc_idx''] = ''price_'' + df.idx.astype(str) product = df.pivot(index=''Salesman'',columns=''prod_idx'',values=''product'') prc = df.pivot(index=''Salesman'',columns=''prc_idx'',values=''price'') reshape = pd.concat([product,prc],axis=1) reshape[''Height''] = df.set_index(''Salesman'')[''Height''].drop_duplicates() print reshape product_0 product_1 product_2 price_0 price_1 price_2 Height Salesman Knut bat ball wand 5 1 3 6 Steve pen NaN NaN 2 NaN NaN 5

Edición: si desea generalizar el procedimiento a más variables, creo que podría hacer algo como lo siguiente (aunque podría no ser lo suficientemente eficiente):

df[''idx''] = df.groupby(''Salesman'').cumcount() tmp = [] for var in [''product'',''price'']: df[''tmp_idx''] = var + ''_'' + df.idx.astype(str) tmp.append(df.pivot(index=''Salesman'',columns=''tmp_idx'',values=var)) reshape = pd.concat(tmp,axis=1)

@Luke dijo:

Creo que Stata puede hacer algo como esto con el comando remodelar.

Puede, pero creo que también necesita un contador dentro del grupo para obtener la remodelación en stata para obtener el resultado deseado:

+-------------------------------------------+ | salesman idx height product price | |-------------------------------------------| 1. | Knut 0 6 bat 5 | 2. | Knut 1 6 ball 1 | 3. | Knut 2 6 wand 3 | 4. | Steve 0 5 pen 2 | +-------------------------------------------+

Si agrega idx entonces podría hacer remodelación en stata :

reshape wide product price, i(salesman) j(idx)


pivoted = df.pivot(''salesman'', ''product'', ''price'')

pg. Python 192 para análisis de datos