2017-04-03 57 views
2

我想在兩個數據框中的兩個日期列之間插入python熊貓。在兩個數據框之間插入日期列熊貓

我想給「EVENT」列「DrillDate」從dfDrillTable結合起來,在dfCompTable的下一個最接近的日期次數。 dfDrillTable具有「Drilldate」,將始終發生在dfCompTable「OpenDate」之前之前。 dfDrillTable和dfCompTable 必須都加入「名稱」,但只有dfDrillTable有一個獨特的「EVENT」,我試圖鏈接兩個數據框。

在鑽取表中存在一些不存在於dfCompTable(和vera)中的EVENT數據。我需要這些仍然進入表中,但作爲價值不存在的空白。

我已經創建了兩個示例數據框供以下參考。然後第三個顯示我想要的結果。

我知道有多種方法可以用outerjoins和this和this做到這一點,但我只是尋找在兩個日期之間插入的最乾淨,最簡單的方法。

#dfDrillTable 

Name EVENT DrillDate 
0 W1 E1 2000-01-01 
1 W1 E2 2000-03-01 
2 W2 E3 2000-04-01 
3 W1 E4 2000-05-15 
4 W2 E5 2000-01-10 
5 W3 E6 2000-02-01 
6 G1 E1 2000-02-02 

    #dfCompTable 
    Name OpenDate 
0 W1 2000-01-02 
1 W1 2000-03-15 
2 W1 2000-05-10 
3 W1 2000-05-20 
4 W2 2000-01-15 
5 W3 2000-02-10 
6 X1 2016-05-05 


    #dfInterp Outcome 


Name EVENT DrillDate OpenDate 
0 W1 E1 2000-01-01 2000-01-02 
1 W1 E2 2000-03-01 2000-03-15 
2 W1 E3 2000-04-01 2000-05-10 
3 W1 E4 2000-05-15 2000-05-20 
4 W2 E5 2000-01-10 2000-01-15 
5 W3 E6 2000-02-01 2000-02-10 
6 G1 E1 2000-01-10 NaT 
7 X1  NaT 2016-05-05 

這裏是創建表

# Two DataTables 
raw_data = {'Name': ['W1', 'W1', 'W2', 'W1', 'W2','W3','G1'], 
      'EVENT':['E1', 'E2', 'E3', 'E4', 'E5','E6','E1'], 
     'DrillDate': ['01/01/2000', '03/01/2000', '04/01/2000', '05/15/2000', '01/10/2000','02/01/2000','02/02/2000']} 
dfDrillTable = pd.DataFrame(raw_data, columns = ['Name','EVENT','DrillDate']) 
dfDrillTable['DrillDate'] = pd.to_datetime(dfDrillTable['DrillDate']) 
dfDrillTable 

raw_data2 = {'Name': ['W1', 'W1', 'W1', 'W1', 'W2','W3','X1'], 
     'OpenDate': ['01/02/2000', '03/15/2000', '05/10/2000', '05/20/2000', '01/15/2000','02/10/2000','05/05/2016']} 
dfCompTable = pd.DataFrame(raw_data2, columns = ['Name','OpenDate']) 
dfCompTable['OpenDate'] = pd.to_datetime(dfCompTable['OpenDate']) 
dfCompTable 

和結果代碼:

# Hopefull Outcome 
raw_data = {'Name': ['W1', 'W1', 'W1', 'W1', 'W2','W3','G1','X1'], 
      'EVENT':['E1', 'E2', 'E3', 'E4', 'E5','E6','E1',''], 
     'DrillDate': ['01/01/2000', '03/01/2000', '04/01/2000', '05/15/2000', '01/10/2000','02/01/2000','01/10/2000',''], 
      'OpenDate': ['01/02/2000', '03/15/2000', '05/10/2000', '05/20/2000', '01/15/2000','02/10/2000','','05/05/2016']} 
dfInterp = pd.DataFrame(raw_data, columns = ['Name','EVENT','DrillDate','OpenDate']) 
dfInterp['DrillDate'] = pd.to_datetime(dfInterp['DrillDate']) 
dfInterp['OpenDate'] = pd.to_datetime(dfInterp['OpenDate']) 
dfInterp 

回答

1

讓我們使用pd.merge_asof:< - 鏈接到文件

pd.merge_asof在版本0.19.0中是新的。確保你已經安裝了最新的熊貓。

dfInterp = pd.merge_asof(dfCompTable.sort_values(by="OpenDate") 
         ,dfDrillTable.sort_values(by="DrillDate") 
         ,left_on="OpenDate",right_on="DrillDate") 

dfInterp[['Name_x','EVENT','DrillDate','OpenDate']].sort_values(by='Name_x') 

    Name_x EVENT DrillDate OpenDate 
0  W1 E1 2000-01-01 2000-01-02 
3  W1 E2 2000-03-01 2000-03-15 
4  W1 E3 2000-04-01 2000-05-10 
5  W1 E4 2000-05-15 2000-05-20 
1  W2 E5 2000-01-10 2000-01-15 
2  W3 E6 2000-02-01 2000-02-10 
+0

謝謝,這適用於quesition中的數據框。 (儘管如此,我認爲你在額外的_on =「DrillDate」中)。當我用我的實際數據運行公式時,我得到一個「ValueError:左鍵必須排序」,我排序他們,但仍然不會工作。有重複的數據和數據點也不在這兩個數據框中。這是否重要?再次感謝。 – brandog

+0

您能否生成失敗的輸入? –

+0

嗨,很抱歉找回這麼晚。我看到它失敗的原因是因爲在我的原始表格中,開放日期有空白值。我刪除了這些代碼並沒有發生錯誤。輸出不是我想要的,但。它沒有通過「名稱」列加入值。相反,它只是找到最接近的日期,而不考慮「名稱」。我已經更新了上述問題中的代碼以顯示此內容。有沒有辦法再添加一塊邏輯來僅在名稱列是=時插入?謝謝。 – brandog