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.