2017-08-15 16 views
4

Ich habe die folgende DatenstrukturMit Spaltennamen als neues Attribut in Pandas

Date   Agric Food 
01/01/1990 1.3 0.9 
01/02/1990 1.2 0.9 

ich es in das Format Ich kann dies tun in

Date  Sector Beta 
01/01/1990 Agric 1.3 
01/02/1990 Agric 1.2 
01/01/1990 Food 0.9 
01/02/1990 Food 0.9 

während ich bin sicher, verdeckte möchte ein komplizierter Weg, gibt es eine Möglichkeit, dies in ein paar Zeilen Code zu tun?

Antwort

5

Mit pd.DataFrame.melt

df.melt('Date', var_name='Sector', value_name='Beta') 

     Date Sector Beta 
0 01/01/1990 Agric 1.3 
1 01/02/1990 Agric 1.2 
2 01/01/1990 Food 0.9 
3 01/02/1990 Food 0.9 
+0

schnell Frage: Sie haben df.melt verwendet, aber der von Ihnen hinzugefügte Link ist pd.melt(), sind sie gleichwertig? – Lost1

+0

Sie sind gleichwertig. In "Pandas 0.20" wurde dann "pd.melt" in eine "pd.DataFrame" -Methode umgewandelt. Ich habe die Links durcheinander gebracht. Ich habe die Links repariert, aber sie sind gleichwertig. – piRSquared

5

Verwenden set_index und stack:

df.set_index('Date').rename_axis('Sector',axis=1).stack()\ 
    .reset_index(name='Beta') 

Ausgang:

  Date Sector Beta 
0 01/01/1990 Agric 1.3 
1 01/01/1990 Food 0.9 
2 01/02/1990 Agric 1.2 
3 01/02/1990 Food 0.9 
+0

Nizza 'stack' ~ :) – Wen

4

Oder Sie können mit lreshape

df=pd.lreshape(df2, {'Date': ["Date","Date"], 'Beta': ['Agric', 'Food']}) 
df['Sector']=sorted(df2.columns.tolist()[1:3]*2) 

    Out[654]: 
     Date Beta Sector 
0 01/01/1990 1.3 Agric 
1 01/02/1990 1.2 Agric 
2 01/01/1990 0.9 Food 
3 01/02/1990 0.9 Food 

Falls Sie 48 Spalten

df=pd.lreshape(df2, {'Date':['Date']*2, 'Beta': df2.columns.tolist()[1:3]}) 
df['Sector']=sorted(df2.columns.tolist()[1:3]*2) 

auch für die Spalten Sektor haben, ist es mehr Sicherheit es

import itertools 
list(itertools.chain.from_iterable(itertools.repeat(x, 2) for x in df2.columns.tolist()[1:3])) 

EDIT Ursache lreshap ist nicht dokumentiert (Stand @ Ted Petrou von

erstellen Verwenden Sie am besten verfügbare DataFrame-Methoden, wenn möglich, und verwenden Sie dokumentierte Funktionen, wenn keine verfügbar sind. Pandas ist ständig auf der Suche nach Verbesserung seiner API und Aufruf undokumentiert, alte und experimentelle Funktionen wie lreshape für alles ist unberechtigt. Außerdem ist dieses Problem ein sehr einfacher Anwendungsfall für Schmelze oder Stapel. Es ist ein schlechter Präzedenzfall dafür, dass neue Pandas zu Stack Overflow kommen und mit lreshape uploged Antworten finden.)

Auch, wenn Sie mehr darüber wissen möchten, können Sie es überprüfen bei github

Nachfolgend finden Sie das Verfahren durch pd.wide_to_long mit

dict1 = {'Agric':'A_Agric','Food':'A_Food'} 
df2 = df.rename(columns=dict1) 
pd.wide_to_long(df2.reset_index(),['A'],i='Date',j='Sector',sep='_',suffix='.').reset_index().drop('index',axis=1).rename(columns={'A':'Beta '}) 

Out[2149]: 
     Date Sector Beta 
0 01/01/1990 Agric 1.3 
1 01/02/1990 Agric 1.2 
2 01/01/1990 Food 0.9 
3 01/02/1990 Food 0.9 
+0

meine einzige Sorge damit ist, dass ich 48 Spalten in den realen Daten habe. :) – Lost1

+0

Dann können Sie 'df.columns.tolist()' verwenden, eine Sekunde, ich werde es bearbeiten – Wen

+0

@ Lost1 Edited ~ – Wen

Verwandte Themen