2017-08-18 106 views
2

場景:繼上一個關於如何從服務器讀取excel文件到數據框(How to read an excel file directly from a Server with Python)的問題,我試圖合併多個數據幀的上下文(其中包含來自Excel工作表的數據)。在具有結構化數據的列上合併Pandas Dataframe

Issue:即使在SO中搜索類似的問題後,仍然無法解決問題。數據

格式(每張讀入數據幀):

Sheet 1 (db1) 
Name  CUSIP  Date  Price 

A   XXX  01/01/2001  100 
B   AAA  02/05/2005  90 
C   ZZZ  03/07/2006  95 

Sheet2 (db2) 
Ident  CUSIP  Value  Class 

123  XXX   0.5  AA 
444  AAA   1.3  AB 
555  ZZZ   2,8  AC 

通緝輸出(民族解放力量):

Name  CUSIP  Date  Price  Ident  Value  Class 
A   XXX  01/01/2001  100   123   0.5  AA 
B   AAA  02/05/2005  90   444   1.3  AB 
C   ZZZ  03/07/2006  95   555   2.8  AC 

我已經嘗試過:我想使用合併功能來匹配每個數據幀,但我得到了「如何」部分的錯誤。

fnl = db1 

fnl = fnl.merge(db2, how='outer', on=['CUSIP']) 

fnl = fnl.merge(db3, how='outer', on=['CUSIP']) 

fnl = fnl.merge(bte, how='outer', on=['CUSIP']) 

我也試過連接,但我只是得到一個數據幀的列表,而不是一個單一的輸出。

wsframes = [db1 ,db2, db3] 

fnl = pd.concat(wsframes, axis=1) 

問題:什麼是做這個操作的正確方法?

+0

什麼錯誤你會得到嗎? –

+0

KeyError:合併過程的'CUSIP'。對於concat,我得到了dataframes的列表,但我不能把它們放在一起做操作。 – DGMS89

+0

您的錯誤表明'CUSIP'不可見作爲列。當你寫'db1 ['CUSIP']'或'db2 ['CUSIP']'時,你會得到什麼? –

回答

6

看來你需要:

from functools import reduce 
#many dataframes 
dfs = [df1,df2] 
df = reduce(lambda x, y: x.merge(y, on='CUSIP', how='outer'), dfs) 
print (df) 
    Name CUSIP  Date Price Ident Value Class 
0 A XXX 01/01/2001 100 123 0.5 AA 
1 B AAA 02/05/2005  90 444 1.3 AB 
2 C ZZZ 03/07/2006  95 555 2,8 AC 

但在每個數據幀列必須是不同的(沒有匹配的列(CUSIP這裏)),否則得到_x_y後綴:

dfs = [df1,df1, df2] 
df = reduce(lambda x, y: x.merge(y, on='CUSIP', how='outer'), dfs) 
print (df) 
    Name_x CUSIP  Date_x Price_x Name_y  Date_y Price_y Ident Value \ 
0  A XXX 01/01/2001  100  A 01/01/2001  100 123 0.5 
1  B AAA 02/05/2005  90  B 02/05/2005  90 444 1.3 
2  C ZZZ 03/07/2006  95  C 03/07/2006  95 555 2,8 

    Class 
0 AA 
1 AB 
2 AC 
+0

我認爲他已經嘗試過合併,但是抱怨得到一個錯誤 –

+0

我不認爲ti必須使用另一個庫,如functools。他也可以在CUSIP上進行set_index並進行合併。 – Wli

+0

我覺得錯誤可能是因爲後綴,但不能確定。 – jezrael

相關問題