Portanto, meu conjunto de dados tem algumas informações por localização para n datas. O problema é que cada data é, na verdade, um cabeçalho de coluna diferente. Por exemplo, o CSV parece
location name Jan-2010 Feb-2010 March-2010
A "test" 12 20 30
B "foo" 18 20 25
O que eu gostaria é que se parecesse
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
O problema é que não sei quantas datas estão na coluna (embora eu saiba que sempre começarão após o nome)
Respostas:
ATUALIZAÇÃO
De v0.20,
melt
é uma função de primeira ordem, agora você pode usarVERSÕES ANTIGAS (ER): <0,20
Você pode usar
pd.melt
para obter a maior parte do caminho até lá e depois classificar:(Pode ser necessário adicionar um
.reset_index(drop=True)
, apenas para manter a saída limpa.)Nota :
pd.DataFrame.sort
foi descontinuado a favor depd.DataFrame.sort_values
.fonte
df2
[de volta] paradf
pandas.pivot_table(df2,values='Value',index=['location','name'],columns='Date').reset_index()
.Use
set_index
comstack
paraMultiIndex Series
e paraDataFrame
adicionarreset_index
comrename
:fonte
Acho que encontrei uma solução mais simples
Concate todo
temp1
comtemp2
a coluna dename
Agora você tem o que pediu.
fonte
pd.wide_to_long
Você pode adicionar um prefixo às colunas do ano e, em seguida, alimentar diretamente para
pd.wide_to_long
. Não vou fingir que isso é eficiente , mas em certas situações pode ser mais conveniente do quepd.melt
, por exemplo, quando suas colunas já têm um prefixo apropriado.fonte