2017-05-24 58 views
0

我試圖合併3個dataframes有一個共同的日期欄丟失任何行(用作索引)Python的大熊貓:合併三個DataFrames有一個共同的日期列,而不對最終結果

第一個數據幀中包含空氣pollutans和沉澱的一些值:

╔════════════╦═══════════════╦═════════╦═════════╦═════╦═════════╦═════╗ 
║ DATE  ║ PRECIPITATION ║ PM 10 ║ PM 2.5 ║ NO2 ║ SO2  ║ CO ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-01 ║ 0.0   ║ 129.2 ║ 49.3 ║ NaN ║ NaN  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-02 ║ -9999.0  ║ -9999.0 ║ -9999.0 ║ NaN ║ NaN  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-03 ║ -9999.0  ║ NaN  ║ -9999.0 ║ NaN ║ NaN  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-04 ║ -9999.0  ║ -9999.0 ║ -9999.0 ║ NaN ║ NaN  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-05 ║ NaN   ║ NaN  ║ NaN  ║ NaN ║ NaN  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-06 ║ -9999.0  ║ -9999.0 ║ -9999.0 ║ NaN ║ NaN  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-07 ║ 2.7   ║ 78.1 ║ 24.4 ║ NaN ║ NaN  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-08 ║ 5.3   ║ 99.9 ║ 31.1 ║ NaN ║ NaN  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-09 ║ 0.1   ║ 116.5 ║ 36.3 ║ NaN ║ -9999.0 ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-10 ║ 0.0   ║ 100.2 ║ 30.8 ║ NaN ║ 5.0  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-11 ║ 0.0   ║ 113.3 ║ 34.5 ║ NaN ║ 4.4  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-12 ║ 0.0   ║ 85.4 ║ 28.6 ║ NaN ║ 3.2  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-13 ║ 0.0   ║ 55.7 ║ 16.6 ║ NaN ║ 2.7  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-14 ║ 5.0   ║ 89.6 ║ 27.4 ║ NaN ║ 3.8  ║ NaN ║ 
╠════════════╬═══════════════╬═════════╬═════════╬═════╬═════════╬═════╣ 
║ 2009-01-15 ║ 1.0   ║ 109.9 ║ 32.2 ║ NaN ║ 4.6  ║ NaN ║ 
╚════════════╩═══════════════╩═════════╩═════════╩═════╩═════════╩═════╝ 

...和日期繼續,直到2009-12-31

第二數據幀中包含的最大值,最小值和平均溫度值:

╔════════════╦═════════╦══════╦══════════╗ 
║ DATE  ║ min  ║ max ║ avg  ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-01 ║ 10.1 ║ 13.1 ║ 11.47 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-02 ║ 13.3 ║ 18.7 ║ 16.38 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-03 ║ -9999.0 ║ 13.1 ║ -2490.10 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-04 ║ NaN  ║ NaN ║ NaN  ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-05 ║ -9999.0 ║ 20.8 ║ -698.73 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-06 ║ 11.4 ║ 17.9 ║ 14.64 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-07 ║ 11.2 ║ 18.9 ║ 14.60 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-08 ║ 10.2 ║ 19.1 ║ 14.65 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-09 ║ 9.4  ║ 18.4 ║ 14.05 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-10 ║ 9.2  ║ 20.7 ║ 13.85 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-11 ║ 9.7  ║ 17.8 ║ 14.32 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-12 ║ 12.4 ║ 17.8 ║ 14.83 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-13 ║ 12.4 ║ 17.1 ║ 14.51 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-14 ║ 7.0  ║ 19.7 ║ 13.77 ║ 
╠════════════╬═════════╬══════╬══════════╣ 
║ 2009-01-15 ║ 10.5 ║ 17.0 ║ 13.93 ║ 
╚════════════╩═════════╩══════╩══════════╝ 

,而第三個包含ERA成果的數量:

╔════════════╦═════════════════╗ 
║ DATE  ║ NUMBER OF CASES ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-01 ║ 63.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-02 ║ 38.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-03 ║ 33.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-04 ║ 161.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-05 ║ 192.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-06 ║ 164.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-07 ║ 149.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-08 ║ 159.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-09 ║ 42.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-10 ║ 44.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-11 ║ 154.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-12 ║ 143.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-13 ║ 165.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-14 ║ 166.0   ║ 
╠════════════╬═════════════════╣ 
║ 2009-05-15 ║ 153.0   ║ 
╚════════════╩═════════════════╝ 

我試圖做的是要合併三個dataframes並生成一個與索引的所有數據在同一天。使用

我的代碼如下:

import pandas.io.sql as psql 
import pandas as pd 

connection_first_second_dataf = pg.connect("dbname=db_1 user=postgres") 
connection_third_dataf = pg.connect("dbname=db_2 user=postgres") 

first_dataframe = psql.read_sql("SELECT * FROM \"VIEW_1\"", connection_first_second_dataf) 

second_dataframe = psql.read_sql("SELECT * FROM \"VIEW_2\"", connection_first_second_dataf) 

thir_dataframe = psql.read_sql("SELECT * FROM \"VIEW_3\"", connection_third_dataf) 


dataframe_result = pd.merge(first_dataframe, 
          second_dataframe, 
          on='DATE') 

dataframe_result = pd.merge(dataframe_result, 
          thir_dataframe, 
          on='DATE') 

而最終的結果如下:

╔════════════╦═══════════════╦═══════╦════════╦═════╦═════╦═════════╦══════╦══════╦═══════╦═════════════════╗ 
║ DATE  ║ PRECIPITATION ║ PM 10 ║ PM 2.5 ║ NO2 ║ SO2 ║ CO  ║ min ║ max ║ avg ║ NUMBER OF CASES ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-01 ║ 4.0   ║ 79.2 ║ 31.2 ║ NaN ║ 6.7 ║ 0.5  ║ 10.4 ║ 17.2 ║ 14.34 ║ 63.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-02 ║ 0.0   ║ 82.2 ║ 28.9 ║ NaN ║ 7.3 ║ 0.4  ║ 12.5 ║ 17.4 ║ 14.76 ║ 38.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-03 ║ 0.2   ║ 77.1 ║ 23.0 ║ NaN ║ 4.1 ║ 0.4  ║ 11.9 ║ 16.4 ║ 14.05 ║ 33.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-04 ║ 0.6   ║ 53.8 ║ 13.7 ║ NaN ║ 2.3 ║ -9999.0 ║ 11.4 ║ 15.9 ║ 13.35 ║ 161.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-05 ║ 0.7   ║ 50.4 ║ 17.0 ║ NaN ║ 2.5 ║ -9999.0 ║ 12.5 ║ 18.6 ║ 14.89 ║ 192.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-06 ║ 0.0   ║ 76.1 ║ 23.8 ║ NaN ║ 5.1 ║ -9999.0 ║ 11.8 ║ 17.4 ║ 14.43 ║ 164.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-07 ║ 0.3   ║ 97.7 ║ 34.0 ║ NaN ║ 9.6 ║ -9999.0 ║ 13.2 ║ 20.6 ║ 15.82 ║ 149.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-08 ║ 0.2   ║ 69.6 ║ 20.3 ║ NaN ║ 5.5 ║ -9999.0 ║ 11.6 ║ 20.4 ║ 15.49 ║ 159.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-09 ║ 0.0   ║ 87.4 ║ 26.3 ║ NaN ║ 5.2 ║ -9999.0 ║ 12.9 ║ 19.4 ║ 15.69 ║ 42.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-10 ║ 0.0   ║ 74.6 ║ 19.9 ║ NaN ║ 3.6 ║ 0.3  ║ 12.8 ║ 19.0 ║ 15.52 ║ 44.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-11 ║ 0.6   ║ 57.6 ║ 17.1 ║ NaN ║ 3.6 ║ -9999.0 ║ 12.5 ║ 20.2 ║ 15.48 ║ 154.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-12 ║ 0.0   ║ 63.7 ║ 19.5 ║ NaN ║ 4.7 ║ -9999.0 ║ 9.9 ║ 20.0 ║ 14.97 ║ 143.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-13 ║ 0.0   ║ 95.4 ║ 27.6 ║ NaN ║ 6.4 ║ -9999.0 ║ 12.6 ║ 20.8 ║ 15.45 ║ 165.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-14 ║ 0.0   ║ 101.7 ║ 29.1 ║ NaN ║ 5.0 ║ 0.5  ║ 11.7 ║ 19.6 ║ 14.94 ║ 166.0   ║ 
╠════════════╬═══════════════╬═══════╬════════╬═════╬═════╬═════════╬══════╬══════╬═══════╬═════════════════╣ 
║ 2009-05-15 ║ 0.0   ║ 112.5 ║ 40.1 ║ NaN ║ 8.0 ║ 0.9  ║ 11.7 ║ 19.1 ║ 14.81 ║ 153.0   ║ 
╚════════════╩═══════════════╩═══════╩════════╩═════╩═════╩═════════╩══════╩══════╩═══════╩═════════════════╝ 

正如我們所看到的,第一和第二數據幀開始於2009-01-01和第三個在2009-05-01,當我試圖將三個數據框合併爲一個時,最終的數據框從2009-05-01開始。

我的問題是,我如何強制我的最終數據框以2009-01-01的值開始? (無論「案例數量」列是否具有2009-01-01至2009-04-31的NaN值,我知道我沒有這些日期的任何數據)。

我看過大熊貓的資料,但我沒有找到我所需要的任何解決方案,對不起我的英語水平,

謝謝。

+2

在你的合併中傳遞參數how ='outer'。默認是內部 – Vaishali

+0

它的作品就像一個魅力,謝謝 –

+0

很高興它的工作,你幾乎在你自己的所以沒有發佈回答:) – Vaishali

回答

0

如何:

result = first_dataframe \ 
     .merge(second_dataframe, on='DATE', how='outer') \ 
     .merge(thir_dataframe, on='DATE', how='outer') 

短代碼和關鍵字是 '外'。

相關問題