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
.