2017-01-09 103 views
1

我有2個dataframes是很仔細看下面的一個(有一些但是不應該影響產生的額外列):熊貓:數據幀合併有兩列錯誤匹配

編輯:添加額外的變量按照要求。 - 符號表示丟失的數據

dataframe1

ProductID  Date   Booked Rate 

10    01/01/2017  10.0 
10    02/01/2017  0.3 
10    03/01/2017  70.4 
20    01/01/2017  100.0 
20    02/01/2017  70.0 
20    03/01/2017  0.1 
-    04/01/2017  0.5 

dataframe2

ProductID  Date   Actual Rate 

10    01/01/2017  11.0 
10    02/01/2017  12.3 
10    03/01/2017  75.4 
20    01/01/2017  110.0 
20    02/01/2017  80.0 
30    03/01/2017  10.1 
-    04/01/2017  0.7 

理想情況下,結果應該是數據幀3:

ProductID  Date   Booked Rate Actual Rate 

10   01/01/2017  10.0   11.0 
10   02/01/2017  0.3   12.3 
10   03/01/2017  70.4   75.4 
20   01/01/2017  100.0  110.0 
20   02/01/2017  70.0   80.0 
20   03/01/2017  0.1   - 
-    04/01/2017  0.5   - 

當我做我的真實數據集的合併,使用下面的代碼:

df3 = pd.merge(left=df1, right=df2, how="left", left_on=["ProductID", "Date"], right_on=["ProductID", "Date"]) 

我得到錯誤的結果從額外的列(中省略爲清楚起見)號碼有時一倍/兩倍。

編輯:這似乎是因爲它與dataframe1中的空ProductID字段與dataframe2中的空productID匹配。我需要省略這一點。

我真正需要的是一個簡單的合併,其中當dataframe2中的productId和Date找到匹配時,將dataframe2的實際比率作爲新列添加。應該排除dataframe2中的任何額外項目,並且不應排除dataframe1中的任何匹配。

我也試過了,對,內,外,合併。

它似乎總是以相同的方式扭曲結果(將某些行項目加倍和增加三倍)。

+0

是畸形的日期故意的嗎? – piRSquared

+0

'-'是否意味着它缺少或等於字符串'' - ''? – piRSquared

回答

0

使用pd.merge

dataframe1.merge(dataframe2, on=['ProductID', 'Date'], how='left') 

    ProductID  Date Booked Rate Actual Rate 
0   10 01/01/2017   10.0   11.0 
1   10 02/01/2017   0.3   12.3 
2   10 03/01/2017   70.4   75.4 
3   20 01/01/2017  100.0  110.0 
4   20 02/01/2017   70.0   80.0 
5   20 03/01/2017   0.1   NaN 

如果你在你的ProductIDNaN

d1 = dataframe1.dropna(subset=['ProductID']) 
d2 = dataframe2.dropna(subset=['ProductID']) 

print(d1.merge(d2, on=['ProductID', 'Date'], how='left')) 

    ProductID  Date Booked Rate Actual Rate 
0  10 01/01/2017   10.0   11.0 
1  10 02/01/2017   0.3   12.3 
2  10 03/01/2017   70.4   75.4 
3  20 01/01/2017  100.0  110.0 
4  20 02/01/2017   70.0   80.0 
5  20 03/01/2017   0.1   NaN 
+0

嗨@pirSquared我也試過這種方法,我的額外列(印象)之一,也經過該類型的合併後從493763131傳遞到561349264。我認爲有些變數我沒有考慮到 –

+1

這就是爲什麼向我們展示你所嘗試過的一個例子,以及一個重現問題的例子是很重要的。事實上,你問了一個簡單的問題,並收到了這個問題的答案。答案已經給出後,你提出還有其他事情要考慮。我明白,要求一個好的完整問題有時很困難。但是你可以從這個經歷中學習,並學習如何更好地表達你將來需要的東西。希望這會有幫助,因爲這就是我的意思。用相關信息編輯你的問題。 – piRSquared

+0

您好@pRSquared,您完全正確。我會修改信息,我想我已經發現了這個問題,也就是說,當產品ID缺少信息時,從兩個數據框中,它會認爲它匹配 –