unstack pivot_table groupby python pandas pivot-table

pivot_table - Python Pandas: tabla dinámica con aggfunc=cuenta única distinta



plot a pivot table pandas (5)

df2 = pd.DataFrame({''X'' : [''X1'', ''X1'', ''X1'', ''X1''], ''Y'' : [''Y2'',''Y1'',''Y1'',''Y1''], ''Z'' : [''Z3'',''Z1'',''Z1'',''Z2'']}) X Y Z 0 X1 Y2 Z3 1 X1 Y1 Z1 2 X1 Y1 Z1 3 X1 Y1 Z2 g=df2.groupby(''X'') pd.pivot_table(g, values=''X'', rows=''Y'', cols=''Z'', margins=False, aggfunc=''count'')

Seguimiento (última llamada más reciente): ... AttributeError: el objeto ''Índice'' no tiene atributo ''índice''

¿Cómo obtengo una tabla dinámica con conteos de valores únicos de una columna DataFrame para otras dos columnas?
¿Hay aggfunc para el conteo único? ¿Debo usar np.bincount() ?

NÓTESE BIEN. Soy consciente de la ''serie'' values_counts() sin embargo necesito una tabla dinámica.

EDITAR: La salida debe ser:

Z Z1 Z2 Z3 Y Y1 1 1 NaN Y2 NaN NaN 1


¿Te refieres a algo como esto?

In [39]: df2.pivot_table(values=''X'', rows=''Y'', cols=''Z'', aggfunc=lambda x: len(x.unique())) Out[39]: Z Z1 Z2 Z3 Y Y1 1 1 NaN Y2 NaN NaN 1

Tenga en cuenta que al usar len supone que no tiene NA en su DataFrame. Puede hacer x.value_counts().count() o len(x.dropna().unique()) contrario.


Como al menos la versión 0.16 de pandas, no toma el parámetro "filas"

A partir de 0.23, la solución sería:

df2.pivot_table(values=''X'', index=''Y'', columns=''Z'', aggfunc=pd.Series.nunique)

que devuelve:

Z Z1 Z2 Z3 Y Y1 1.0 1.0 NaN Y2 NaN NaN 1.0


Creo que esto será más perfecto:

df2.pivot_table(values=''X'',rows=[''Y'',''Z''],cols=''X'',aggfunc=''count'') X1 X2 Y Z Y1 Z1 1 1 Z2 1 NaN Y2 Z3 1 NaN


Puede construir una tabla dinámica para cada valor distinto de X En este caso,

for xval, xgroup in g: ptable = pd.pivot_table(xgroup, rows=''Y'', cols=''Z'', margins=False, aggfunc=numpy.size)

Construirá una tabla dinámica para cada valor de X Es posible que desee indexar ptable usando el xvalue . Con este código, obtengo (para X1 )

X Z Z1 Z2 Z3 Y Y1 2 1 NaN Y2 NaN NaN 1


aggfunc=pd.Series.nunique proporciona un conteo distinto.

Gracias a @hume por esta solución (ver comentario en la respuesta aceptada). Agregando como respuesta aquí para una mejor detección.