2016-07-02 3 views
2

Ich habe zu großen .csv-Dateien, die ich mit Python, Pandas und Numpy handle, hier ist ein Beispiel aus dem granulareren Datensatz (A), die Zeitstempel sind in 15-Minuten-Intervallen:Wie man zwei Pandas DataFrames in einer "horizontalen Union" mit python3 verbindet

Timestamp,Real Energy Into the Load 
2016-06-01T11:00:00, 2 
2016-06-01T10:45:00, 1 
2016-06-01T10:30:00, 5 
2016-06-01T10:15:00, 3 
2016-06-01T10:00:00, 3 
2016-06-01T09:45:00, 6 
2016-06-01T09:30:00, 2 
... 

und hier eine Probe aus den weniger körnig Daten (B) mit Zeitstempel, etwa einer Stunde auseinander, aber es gibt eine Menge eine Abweichung zwischen Zeitmarken.

TimeEDT, TemperatureF, Dew PointF 
2016-06-01T10:33:00,82.0,66.0 
2016-06-01T09:34:00,79.0,64.9 
2016-06-01T09:20:00,75.9,64.9 
... 

Ich mag sie so kombinieren, dass der kombinierte Datenrahmen durch die Gruppierung Mittelwert aus Datenrahmen A die Zeilen die gleiche Anzahl von Zeilen als Datenrahmen B hat. Die letzten entsprechenden Zeilen wären:

TimeEDT, TemperatureF, Dew PointF, Real Energy Into The Load 
2016-06-01T10:33:00,82.0,66.0, 1.5 # average of (1, 2) 
2016-06-01T09:34:00,79.0,64.9, 4.25 # average of (6, 3, 3, 5) 
2016-06-01T09:20:00,75.9,64.9, 2 # average of (2,) 
... 

Ich denke, das ist eine horizontale Union in SQL.

Dinge, die ich bereits ausprobiert habe: Ich nahm Datensatz B (dfB) und dfB['TimeEDT'].apply verwendet, um jedes Datum zu "flood" es ist 15 Minuten stündlich. Von dort aus kann ich die groupby-Funktion verwenden, um die Zeilen zusammenzufassen, um mindestens eine Eins-zu-Eins-Entsprechung zwischen den Zeilen zu haben, aber ich muss die Datenrahmen noch horizontal hinzufügen. Aber ich hätte gerne einen direkteren Weg. Idealerweise könnte das Argument für groupby ein benutzerdefinierter Vergleich sein

+0

Siehe Frage bearbeiten – nteiss

+0

Suche pandas groupby. .mean() – Merlin

+0

Benenne diese beiden Spalten um - es ist immer besser, keine Leerzeichen zu haben. – Merlin

Antwort

1

Möglicherweise können Sie etwas wie unten tun. Ich habe nicht überprüft, ob es funktioniert, wenn es keine Werte während einer Stunde gibt, aber das ist die Idee.

In[1]: import pandas as pd 

In[2]: import numpy as np 

In[3]: df1 = pd.DataFrame({"TemperatureF": np.random.random_integers(60, 90, 20), "DewPointF": np.random.random_integers(60, 90, 20)}, index = pd.date_range("2016-06-01 09:00:00", periods=20, freq="15min")) 

In[4]: df2 = pd.DataFrame({"TemperatureF": np.random.random_integers(60, 90, 5), "DewPointF": np.random.random_integers(60, 90, 5), "RealEnergy": np.random.uniform(1.0, 5.0, 5)}, index = pd.date_range("2016-06-01 09:30:00", periods=5, freq="H")) 

In[5]: df1 
Out[5]: 
        DewPointF TemperatureF 
2016-06-01 09:00:00   66   71 
2016-06-01 09:15:00   84   68 
2016-06-01 09:30:00   68   74 
2016-06-01 09:45:00   66   85 
2016-06-01 10:00:00   70   72 
2016-06-01 10:15:00   63   78 
2016-06-01 10:30:00   82   83 
2016-06-01 10:45:00   67   79 
2016-06-01 11:00:00   63   76 
2016-06-01 11:15:00   72   80 
2016-06-01 11:30:00   82   61 
2016-06-01 11:45:00   60   81 
2016-06-01 12:00:00   77   76 
2016-06-01 12:15:00   78   60 
2016-06-01 12:30:00   75   60 
2016-06-01 12:45:00   83   67 
2016-06-01 13:00:00   84   81 
2016-06-01 13:15:00   66   66 
2016-06-01 13:30:00   80   84 
2016-06-01 13:45:00   87   69 

In[6]: df2 
Out[6]: 
        DewPointF RealEnergy TemperatureF 
2016-06-01 09:30:00   84 2.479343   88 
2016-06-01 10:30:00   64 1.428840   67 
2016-06-01 11:30:00   88 3.214666   83 
2016-06-01 12:30:00   72 4.280898   71 
2016-06-01 13:30:00   62 3.376502   78 


In[7]: df2.merge(df1.groupby(df1.index.hour)["DewPointF", "TemperatureF"].mean(), on=df2.index.hour) 
Out[7]: 
    key_0 DewPointF_x RealEnergy TemperatureF_x DewPointF_y TemperatureF_y 
0  9   84 2.479343    88  71.00   74.50 
1  10   64 1.428840    67  70.50   78.00 
2  11   88 3.214666    83  69.25   74.50 
3  12   72 4.280898    71  78.25   65.75 
4  13   62 3.376502    78  79.25   75.00 
+0

Ill es ausprobieren. Es ist definitiv, was ich anstrebe, und die Ausnahmebehandlung ist nicht der Hauptteil des Problems. Danke – nteiss

+0

großartig! Bitte schön. –

Verwandte Themen