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)
问题:执行此操作的正确方法是什么?
看来你需要:
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)
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |