2017-09-10 42 views
1

我試圖用Python 2.7和熊貓一起連接三個表。我的表像下面的:一對多,左,外連接熊貓(Python)

Table 1 
ID | test 
1 | ss 
2 | sb 
3 | sc 

Table 2 
ID | tested | value1 | Value2 | ID2 
1 | a  | e  | o  | 1 
1 | axe  | ee  | e  | 1 
1 | bce  | io  | p  | 3 
2 | bee  | kd  | …  | 2 
2 | bdd  | a  | fff  | 3 
3 | db  | f  | yiueie | 2 

Table 3 
ID2 | type 
1 | i 
1 | d 
1 | h 
3 | e 
1 | o 
2 | ou 
2 | oui 
3 | op 

我正在使用的代碼如下:

import pandas as pd 

xl = pd.ExcelFile(r'C:\Users\Joe\Desktop\Project1\xlFiles\test1.xlsx') 
xl.sheet_names 
df = xl.parse("Sheet1") 
df.head() 

xl2 = pd.ExcelFile(r'C:\Users\Joe\Desktop\Project1\xlFiles\test2.xlsx') 
xl2.sheet_names 
df2 = xl2.parse("Sheet1") 
df2.head() 

xl3 = pd.ExcelFile(r'C:\Users\Joe\Desktop\Project1\xlFiles\test3.xlsx') 
xl3.sheet_names 
df3 = xl3.parse("Sheet1") 
df3.head() 

df3 = df3.groupby('ID2')['type'].apply(','.join).reset_index() 

s1 = pd.merge(df2, df3, how='left', on=['ID2']) 

的代碼加入表3至表表2我怎麼想。但是,我無法弄清楚如何將多個列組合到一起來將s1連接到表1.我需要將s1中每一列的信息添加到表1中,但我只需要一行每個ID值(總共3行)。有誰知道我會怎麼做?

我的預期輸出,以供參考,下面是:提前爲幫助

ID | test | type  | tested  | value1 | ID2 
1 | ss | i,d,h,o | a,axe,bce | e,ee,io | 1,1,3 
2 | sb | ou,oui | bee,bdd | kd,a  | 2,3 
3 | sc | e,op  | db   | f  | 2 

感謝。

回答

0

您可以通過獨特的pairs兩個df2df3使用cumcount用於計數ID2的合併。然後groupby和聚合join

最後使用join

df2['g'] = df2.groupby('ID2').cumcount() 
df3['g'] = df3.groupby('ID2').cumcount() 
df23 = pd.merge(df2, df3, how='left', on=['g','ID2']).astype(str).groupby('ID').agg(','.join) 
#for same dtype for match - int 
df23.index = df23.index.astype(int) 
print (df23) 
     tested value1 Value2 ID2  g type 
ID             
1 a,axe,bce e,ee,io o,e,p 1,1,3 0,1,0 i,d,e 
2  bee,bdd  kd,a ...,fff 2,3 0,1 ou,op 
3   db  f yiueie  2  1 oui 

df = df1.join(df23, on='ID') 
#subset and desired order of output columns 
cols = ['ID','test','type','tested','value1','ID2'] 
df = df[cols] 
print (df) 
    ID test type  tested value1 ID2 
0 1 ss i,d,e a,axe,bce e,ee,io 1,1,3 
1 2 sb ou,op bee,bdd  kd,a 2,3 
2 3 sci oui   db  f  2 
+1

嘿jezrael - 這正是我一直在尋找。你真的很棒。非常感謝您的快速回復! – user68114

+0

很高興能幫助,歡迎您! – jezrael