valores de fila de pandas a encabezados de columna

Tengo un daraframe asi

df = pd.DataFrame({'id1':[1,1,1,1,2,2,2],'id2':[1,1,1,1,2,2,2],'value':['a','b','c','d','a','b','c']}) id1 id2 value 0 1 1 a 1 1 1 b 2 1 1 c 3 1 1 d 4 2 2 a 5 2 2 b 6 2 2 c 

Necesito transformarme en esta forma.

  id1 id2 abcd 0 1 1 1 1 1 1 1 2 2 1 1 1 0 

Puede haber cualquier número de niveles en las variables de valor para cada ID desde 1 hasta 10. Si el nivel no está presente para ese ID, debería ser 0 si no 1.

Estoy usando anaconda python 3.5, windows 10

Si necesita salida 1 y 0 solo por presencia de value :

Puedes usar get_dummies con Series creadas por set_index , pero luego es necesario groupby + GroupBy.max :

 df = pd.get_dummies(df.set_index(['id1','id2'])['value']) .groupby(level=[0,1]) .max() .reset_index() print (df) id1 id2 abcd 0 1 1 1 1 1 1 1 2 2 1 1 1 0 

Otra solución con groupby , size y unstack , pero luego es necesario comparar con gt y convertir a int por astype . Último reset_index y rename_axis :

 df = df.groupby(['id1','id2', 'value']) .size() .unstack(fill_value=0) .gt(0) .astype(int) .reset_index() .rename_axis(None, axis=1) print (df) id1 id2 abcd 0 1 1 1 1 1 1 1 2 2 1 1 1 0 

Si es necesario contar el value s:

 df = pd.DataFrame({'id1':[1,1,1,1,2,2,2], 'id2':[1,1,1,1,2,2,2], 'value':['a','b','a','d','a','b','c']}) print (df) id1 id2 value 0 1 1 a 1 1 1 b 2 1 1 a 3 1 1 d 4 2 2 a 5 2 2 b 6 2 2 c df = df.groupby(['id1','id2', 'value']) .size() .unstack(fill_value=0) .reset_index() .rename_axis(None, axis=1) print (df) id1 id2 abcd 0 1 1 2 1 0 1 1 2 2 1 1 1 0 

O:

 df = df.pivot_table(index=['id1','id2'], columns='value', aggfunc='size', fill_value=0) .reset_index() .rename_axis(None, axis=1) print (df) id1 id2 abcd 0 1 1 2 1 0 1 1 2 2 1 1 1 0