usar tablas sumar recorrer promedio para leer funciones datos data como columnas python pandas

python - tablas - los pandas convierten algunas columnas en filas



recorrer data frame pandas (4)

Entonces mi conjunto de datos tiene alguna información por ubicación para n fechas. El problema es que cada fecha es en realidad un encabezado de columna diferente. Por ejemplo, el CSV parece

location name Jan-2010 Feb-2010 March-2010 A "test" 12 20 30 B "foo" 18 20 25

Lo que me gustaría es que se vea

location name Date Value A "test" Jan-2010 12 A "test" Feb-2010 20 A "test" March-2010 30 B "foo" Jan-2010 18 B "foo" Feb-2010 20 B "foo" March-2010 25

El problema es que no sé cuántas fechas hay en la columna (aunque sé que siempre comenzarán después del nombre)


pd.wide_to_long

Puede agregar un prefijo a las columnas de su año y luego alimentar directamente a pd.wide_to_long . No pretendo que esto sea eficiente , pero en ciertas situaciones puede ser más conveniente que pd.melt , por ejemplo, cuando sus columnas ya tienen un prefijo apropiado.

df.columns = np.hstack((df.columns[:2], df.columns[2:].map(lambda x: f''Value{x}''))) res = pd.wide_to_long(df, stubnames=[''Value''], i=''name'', j=''Date'').reset_index()/ .sort_values([''location'', ''name'']) print(res) name Date location Value 0 test Jan-2010 A 12 2 test Feb-2010 A 20 4 test March-2010 A 30 1 foo Jan-2010 B 18 3 foo Feb-2010 B 20 5 foo March-2010 B 25


Creo que encontré una solución más simple

temp1[''new_column''] = temp2[''name'']

Concat entero temp1 con el name columna temp2

df1 = (df.set_index(["location", "name"]) .stack() .reset_index(name=''Value'') .rename(columns={''level_2'':''Date''})) print (df1) location name Date Value 0 A test Jan-2010 12 1 A test Feb-2010 20 2 A test March-2010 30 3 B foo Jan-2010 18 4 B foo Feb-2010 20 5 B foo March-2010 25

Ahora tienes lo que pediste.


Use set_index con stack para MultiIndex Series , luego para DataFrame agregue reset_index con rename :

temp1 = pd.melt(df1, id_vars=["location"], var_name=''Date'', value_name=''Value'') temp2 = pd.melt(df1, id_vars=["name"], var_name=''Date'', value_name=''Value'')


ACTUALIZAR
Desde v0.20, melt es una función de primer orden, ahora puede usar

df.melt(id_vars=["location", "name"], var_name="Date", value_name="Value") location name Date Value 0 A "test" Jan-2010 12 1 B "foo" Jan-2010 18 2 A "test" Feb-2010 20 3 B "foo" Feb-2010 20 4 A "test" March-2010 30 5 B "foo" March-2010 25

VERSIONES ANTIGUAS (ER): <0.20

Puede usar pd.melt para obtener la mayor parte del camino y luego ordenar:

>>> df location name Jan-2010 Feb-2010 March-2010 0 A test 12 20 30 1 B foo 18 20 25 >>> df2 = pd.melt(df, id_vars=["location", "name"], var_name="Date", value_name="Value") >>> df2 location name Date Value 0 A test Jan-2010 12 1 B foo Jan-2010 18 2 A test Feb-2010 20 3 B foo Feb-2010 20 4 A test March-2010 30 5 B foo March-2010 25 >>> df2 = df2.sort(["location", "name"]) >>> df2 location name Date Value 0 A test Jan-2010 12 2 A test Feb-2010 20 4 A test March-2010 30 1 B foo Jan-2010 18 3 B foo Feb-2010 20 5 B foo March-2010 25

(Es posible que desee .reset_index(drop=True) un .reset_index(drop=True) , solo para mantener la salida limpia).

Nota : pd.DataFrame.sort ha quedado en desuso a favor de pd.DataFrame.sort_values .