2016-07-29 13 views
2

Ich habe ein Datenrahmen wie dieseMerge Spalten in Pandas basierend auf Datum Kriterien

In[337]: df 
Out[337]: 
       2013  2014  2015 
2013-01-31 0.705935 0.983307 0.714397 
2013-05-31 0.492020 0.3 0.897666 
2013-09-30 0.187822 0.779611 0.774774 
2014-01-31 0.789511 0.383665 0.353669 
2014-05-31 0.347580 0.540767 0.732863 
2014-09-30 0.382052 0.960596 0.917685 
2015-01-31 0.106079 0.622926 0.302552 
2015-05-31 0.282134 0.195239 0.968098 
2015-09-30 0.185158 0.410412 0.048988 

Ich versuche, die Daten in eine neue Spalte auf das Jahr in dem Index basiert zu verschmelzen. zB „für die Zeile 2014.09.30 Auswahldaten aus der Spalte‚2014‘, 0,960596“

Out[345]: 
       data 
2013-01-31 0.705935 
2013-05-31 0.492020 
2013-09-30 0.187822 
2014-01-31 0.383665 
2014-05-31 0.540767 
2014-09-30 0.960596 
2015-01-31 0.302552 
2015-05-31 0.968098 
2015-09-30 0.048988 

Gibt es eine Möglichkeit, dies zu automatisieren ordentlich mit einer Schleife oder auf andere Weise, wenn?

Danke für Ihre Hilfe!

Antwort

3

Daten Unter der Annahme, werden analysiert, dies zu tun:

df.apply(lambda row: row[str(row.name.year)], axis=1) 

Edit:

Das war das, was ich suchte:

pd.Series(
    df.lookup(
     row_labels=df.index, 
     col_labels=df.index.year.astype(str) 
    ), 
    index=df.index 
) 

Die lookup Methode gibt Ihnen für jede angegebene Zeilenbezeichnung den Wert an der entsprechende Spaltenbezeichnung. Diese Funktion ist um ein Vielfaches schneller (wenn ich den Datenrahmen auf stündlich neu abtast, wird die erste Methode mit ~ 3,5 Sekunden und die Methode lookup mit ~ 20ms terminiert).

+0

..19 Sekunden;) – mhoff

+0

+1, sehr schöne Lösung. Können Sie Ihrer Antwort den Benchmark hinzufügen? Ich denke auch, dass es für andere nützlich sein könnte, eine Serie in den gewünschten Datenrahmen zu konvertieren, z. 'pd.DataFrame (pd.Series (...), Spalten = ['data'])'. – mhoff

2
import pandas as pd 
import datetime 

# reproduce test data 
> df = pd.DataFrame([[datetime.date(2013,01,31), 0.1, 0.2, 0.3], [datetime.date(2014,01,31), 0.1, 0.2, 0.3], [datetime.date(2015,01,31), 0.1, 0.2, 0.3]], columns=['date', '2013', '2014', '2015']).set_index('date') 
> df.index.name = None 
> df 
      2013 2014 2015 
2013-01-31 0.1 0.2 0.3 
2014-01-31 0.1 0.2 0.3 
2015-01-31 0.1 0.2 0.3 

# extract year and use it as a key for the row object 
> df.apply(lambda r: r[str(r.name.year)], axis=1) 
2013-01-31 0.1 
2014-01-31 0.2 
2015-01-31 0.3 

# create the desired dataframe 
> df_new = pd.DataFrame(df.apply(lambda r: r[str(r.name.year)], axis=1), index=df.index, columns=['data']) 
> df_new 
      data 
2013-01-31 0.1 
2014-01-31 0.2 
2015-01-31 0.3 
+1

Schließen Sie eine;). Übrigens können Sie die Daten aus der Frage mit 'df = pd.read_table (io.StringIO (" "" ... "" ", parse_dates = True, delim_whitespace = True)) 'parsen. – filmor

+0

Danke, das wusste ich nicht. – mhoff

+0

@filmor: Übrigens musste ich 'u" "" ... "" schreiben, damit es funktioniert. – mhoff

Verwandte Themen