Python / Pandas – ValueError: el índice contiene entradas duplicadas, no se puede reformar

Tengo un dataframe llamado ‘bal’. Se parece a esto:

ano id unit period business_id 9564 2012 302 sdasd anual 9564 2011 303 sdasd anual 2361 2013 304 sdasd anual 2361 2012 305 sdasd anual ... 

Estoy ejecutando el siguiente código en él:

 bal=bal.merge(bal.pivot(columns='ano', values='id'),right_index=True,left_index=True) 

Mi intención es convertir eso en algo como esto:

  ano id unit period 2006 2007 2008 2009 2010 \ business_id 72 2013 774 sdasd anual NaN NaN NaN NaN NaN 72 2012 775 sdasd anual NaN NaN NaN NaN NaN 74 2012 1120 sdasd anual NaN NaN NaN NaN NaN 119 2013 875 sdasd anual NaN NaN NaN NaN NaN 119 2012 876 sdasd anual NaN NaN NaN NaN NaN ... 

Cuando tengo ese código, me sale este error:

 ValueError: Index contains duplicate entries, cannot reshape 

Así que para evitar duplicados, agregué una línea drop_duplicates:

 bal=bal.drop_duplicates() bal=bal.merge(bal.pivot(columns='ano', values='id'),right_index=True,left_index=True) 

Cuando ejecuto el código, voilá, me sale el mismo problema:

 ValueError: Index contains duplicate entries, cannot reshape 

¿Estoy haciendo algo mal o malinterpretando algo?

EDITAR

bal es un dataframe que estoy creando a partir de un SQL usando el siguiente código:

 bal=pd.read_sql('select * from table;',connection).set_index('business_id')[['ano','id','unit','period']] 

Lo extraño es que si limito la consulta SQL funciona bien:

 bal=pd.read_sql('select * from table limit 1000;',connection).set_index('business_id')[['ano','id','unit','period']] 

Pensé que el problema podría estar relacionado con el hecho de que el índice tiene mucha duplicación (como se puede ver en el ejemplo anterior). Sin embargo, si print(bal.head(4)) en este bal limitado, se ve exactamente igual al que se puede ver arriba, con índices que se repiten.

ACTUALIZACIÓN2:

 qry = "select distinct business_id,ano,id,unit,period from table where period='anual'" bal=pd.read_sql(qry, connection, index_col=['business_id']) 

Supongamos que obtenemos el siguiente DF (aún con valores duplicados en la columna ano ):

 In [167]: bal Out[167]: ano id unit period business_id 9564 2012 302 sdasd anual 9564 2012 299 sdasd anual 9564 2011 303 sdasd anual 2361 2013 304 sdasd anual 2361 2012 305 sdasd anual 

Podemos hacer esto:

 In [169]: bal.join(bal.pivot_table(index=bal.index, columns='ano', values='id', aggfunc='first')) Out[169]: ano id unit period 2011 2012 2013 business_id 2361 2013 304 sdasd anual NaN 305.0 304.0 2361 2012 305 sdasd anual NaN 305.0 304.0 9564 2012 302 sdasd anual 303.0 302.0 NaN 9564 2012 299 sdasd anual 303.0 302.0 NaN 9564 2011 303 sdasd anual 303.0 302.0 NaN 

ACTUALIZAR:

Considere la siguiente muestra DF:

 In [161]: bal Out[161]: ano id unit period business_id 9564 2012 302 sdasd anual 9564 2012 299 sdasd anual # i've intentionally added this row with duplicated `ano` 9564 2011 303 sdasd anual 2361 2013 304 sdasd anual 2361 2012 305 sdasd anual 

reproduciendo tu error:

 In [162]: bal.pivot(columns='ano', values='id') ... skipped ... ValueError: Index contains duplicate entries, cannot reshape 

Respuesta antigua:

¿Es eso lo que quieres?

 In [144]: bal.join(bal.pivot(columns='ano', values='id')) Out[144]: ano id unit period 2011 2012 2013 business_id 2361 2013 304 sdasd anual NaN 305.0 304.0 2361 2012 305 sdasd anual NaN 305.0 304.0 9564 2012 302 sdasd anual 303.0 302.0 NaN 9564 2011 303 sdasd anual 303.0 302.0 NaN 

Considere usar unstack() y merge() – esto se ocupará del problema duplicado.

 # sample data data = {"business_id":[9564, 9564, 2361, 2361], "ano":[2012, 2011, 2013, 2012], "id":[302,303,304,305], "unit":["sdasd"]*4, "period":["anual"]*4} df = pd.DataFrame(data) # include ano for MultiIndex df.set_index(["business_id","ano"], inplace=True) df id period unit business_id ano 9564 2012 302 anual sdasd 2011 303 anual sdasd 2361 2013 304 anual sdasd 2012 305 anual sdasd 

Ahora unstack() , toma los datos de id y merge() . El nivel más interno está sin astackr, por lo que agregamos ano al índice anterior.

 df.merge(df.unstack()['id'], right_index=True, left_index=True) id period unit 2011 2012 2013 business_id ano 9564 2012 302 anual sdasd 303.0 302.0 NaN 2011 303 anual sdasd 303.0 302.0 NaN 2361 2013 304 anual sdasd NaN 305.0 304.0 2012 305 anual sdasd NaN 305.0 304.0