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

DGM*_*S89 2 python dataframe pandas

场景:从上一个关于如何将excel文件从服务器读取到数据帧的问题(如何直接从带有Python的服务器读取excel文件)开始,我试图合并多个数据帧的上下文(包含数据)来自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
Run Code Online (Sandbox Code Playgroud)

通缉输出(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
Run Code Online (Sandbox Code Playgroud)

我已经尝试过:我正在尝试使用merge函数来匹配每个数据帧,但我收到了"how"部分的错误.

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'])
Run Code Online (Sandbox Code Playgroud)

我也试过了连接,但我得到的是数据帧列表,而不是单个输出.

wsframes = [db1 ,db2, db3]

fnl = pd.concat(wsframes, axis=1)
Run Code Online (Sandbox Code Playgroud)

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

jez*_*ael 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
Run Code Online (Sandbox Code Playgroud)

但每个数据框中的列必须不同(没有匹配的列(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  
Run Code Online (Sandbox Code Playgroud)