dividir una serie de Pandas sin un multiindex

Me gustaría tomar una serie de Pandas con un índice de un solo nivel y dividir ese índice en un dataframe con varias columnas. Por ejemplo, para la entrada:

s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c']) s a 10 a 11 b 12 b 13 c 14 c 15 c 16 dtype: int64 

Lo que me gustaría como salida es:

  abc 0 10 12 14 1 11 13 15 2 NaN NaN 16 

No puedo usar directamente el comando Unstack porque requiere un índice múltiple y solo tengo un índice de un solo nivel. Intenté colocar en un índice ficticio que todos tenían el mismo valor, pero obtuve un error “ReshapeError: El índice contiene entradas duplicadas, no se puede reformar”.

Sé que esto es un poco inusual porque 1) a los pandas no les gustan los arreglos irregulares, por lo que será necesario rellenar, 2) el índice debe restablecerse arbitrariamente, 3) Realmente no puedo “inicializar” el dataframe Hasta que sepa cuánto tiempo va a ser la columna más larga. Pero esto todavía parece algo que debería poder hacer de alguna manera. También pensé en hacerlo a través de groupby, pero no parece que haya nada como grouped_df.values ​​() sin ningún tipo de función de agregación, probablemente por las razones anteriores.

Puede usar groupby , apply , reset_index para crear una serie unstack y luego llamar a unstack :

 import pandas as pd s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c']) df = s.groupby(level=0).apply(pd.Series.reset_index, drop=True).unstack(0) print df 

salida:

  abc 0 10 12 14 1 11 13 15 2 NaN NaN 16 

No estoy seguro de cuán generalizable es esto. Yo llamo a esto el groupby a través del patrón concat. Esencialmente una aplicación, pero con control sobre cómo se combina exactamente.

 In [24]: s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c']) In [25]: df = DataFrame(dict(key = s.index, value = s.values)) In [26]: df Out[26]: key value 0 a 10 1 a 11 2 b 12 3 b 13 4 c 14 5 c 15 6 c 16 In [27]: concat(dict([ (g,Series(grp['value'].values)) for g, grp in df.groupby('key') ]),axis=1) Out[27]: abc 0 10 12 14 1 11 13 15 2 NaN NaN 16