Función de fusión de pandas

Tengo un dataframe:

df = pd.DataFrame([[2, 4, 7, 8, 1, 3, 2013], [9, 2, 4, 5, 5, 6, 2014]], columns=['Amy', 'Bob', 'Carl', 'Chris', 'Ben', 'Other', 'Year']) 
  Amy Bob Carl Chris Ben Other Year 0 2 4 7 8 1 3 2013 1 9 2 4 5 5 6 2014 

Y un diccionario:

 d = {'A': ['Amy'], 'B': ['Bob', 'Ben'], 'C': ['Carl', 'Chris']} 

Me gustaría remodelar mi dataframe para que se vea así:

  Group Name Year Value 0 A Amy 2013 2 1 A Amy 2014 9 2 B Bob 2013 4 3 B Bob 2014 2 4 B Ben 2013 1 5 B Ben 2014 5 6 C Carl 2013 7 7 C Carl 2014 4 8 C Chris 2013 8 9 C Chris 2014 5 10 Other 2013 3 11 Other 2014 6 

Tenga en cuenta que Other no tiene ningún valor en la columna Name y el orden de las filas no importa. Creo que debería usar la función de melt , pero los ejemplos que he encontrado no son muy claros.

melt te lleva a la mitad del camino.

 In [29]: m = pd.melt(df, id_vars=['Year'], var_name='Name') 

Esto lo tiene todo excepto el Group . Para conseguir eso, necesitamos remodelar un poco d también.

 In [30]: d2 = {} In [31]: for k, v in d.items(): for item in v: d2[item] = k ....: In [32]: d2 Out[32]: {'Amy': 'A', 'Ben': 'B', 'Bob': 'B', 'Carl': 'C', 'Chris': 'C'} In [34]: m['Group'] = m['Name'].map(d2) In [35]: m Out[35]: Year Name value Group 0 2013 Amy 2 A 1 2014 Amy 9 A 2 2013 Bob 4 B 3 2014 Bob 2 B 4 2013 Carl 7 C .. ... ... ... ... 7 2014 Chris 5 C 8 2013 Ben 1 B 9 2014 Ben 5 B 10 2013 Other 3 NaN 11 2014 Other 6 NaN [12 rows x 4 columns] 

Y moviendo ‘Otro’ de Name a Group

 In [8]: mask = m['Name'] == 'Other' In [9]: m.loc[mask, 'Name'] = '' In [10]: m.loc[mask, 'Group'] = 'Other' In [11]: m Out[11]: Year Name value Group 0 2013 Amy 2 A 1 2014 Amy 9 A 2 2013 Bob 4 B 3 2014 Bob 2 B 4 2013 Carl 7 C .. ... ... ... ... 7 2014 Chris 5 C 8 2013 Ben 1 B 9 2014 Ben 5 B 10 2013 3 Other 11 2014 6 Other [12 rows x 4 columns] 

Función de fusión de pandas: –

Esta función es útil para aplicar un DataFrame en un formato donde una o más columnas son variables identificadoras (id_vars), mientras que todas las demás columnas, consideradas variables medidas (value_vars), están “sin divisiones” en el eje de la fila, dejando solo dos sin identificador columnas, ‘variable’ y ‘valor’.

p.ej:-

 melted = pd.melt(df, id_vars=["weekday"], var_name="Person", value_name="Score") 

Utilizamos Melt para transformar datos de gran tamaño en datos largos.