在具有结构化数据的列上合并Pandas Dataframe

时间:2017-08-18 13:29:54

标签: python pandas dataframe

场景:关于如何将excel文件从服务器读取到数据帧(How to read an excel file directly from a Server with Python)中的上一个问题的跟进,我正在尝试合并多个数据帧的上下文(其中包含来自excel工作表的数据。)

问题:即使在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

通缉输出(fnl):

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)

问题:执行此操作的正确方法是什么?

1 个答案:

答案 0 :(得分: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