2016-07-02 46 views
2

我必須使用python,pandas和numpy處理大型.csv文件,下面是一個來自更細粒度數據集(A)的示例,時間標記是在15分鐘的間隔:如何在python3「水平聯合」中加入兩個pandas DataFrames

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 
... 

,這裏是從與時間戳分開設置約一小時的較少的顆粒數據(B)的樣品,但有很多的時間標記之間的差異。

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 
... 

我想通過分組從數據幀A的行平均值來將它們組合起來,使得合併後的數據幀將具有相同的行數作爲數據幀B的。最後一行對應於:

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,) 
... 

我認爲這在SQL中被稱爲水平聯合。

我已經嘗試過的東西: 我拿了數據集B(dfB)並使用dfB['TimeEDT'].apply來將每個日期「落地」到它的15分鐘小時間隔。從那裏,我可以使用groupby函數將行總計在一起,至少在行之間具有一對一的對應關係,但是我仍然需要水平添加數據幀。但我想有一個更直接的方式來做到這一點。理想情況下,groupby的參數可以是一些用戶定義的比較

+0

查看問題編輯 – nteiss

+0

查找pandas groupby。 .mean() – Merlin

+0

重命名這兩列 - 最好不要有空格。 – Merlin

回答

1

也許你可以做下面的事情。如果一小時內沒有值,我還沒有檢查它是否有效,但這是主意。

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

我試試看。這絕對是我的目標,異常處理不是問題的主要部分。謝謝 – nteiss

+0

太棒了!不用謝。 –