场景:关于如何将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)
问题:执行此操作的正确方法是什么?
答案 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