Python 将列上的Dataframe与结构化数据合并
场景:继上一个关于如何将excel文件从服务器读取到数据框()的问题之后,我正在尝试合并多个数据框(其中包含excel工作表中的数据)的上下文 问题:即使在SO中搜索了类似的问题,我仍然无法解决问题 数据格式(每张图纸都读入一个数据框):Python 将列上的Dataframe与结构化数据合并,python,pandas,dataframe,Python,Pandas,Dataframe,场景:继上一个关于如何将excel文件从服务器读取到数据框()的问题之后,我正在尝试合并多个数据框(其中包含excel工作表中的数据)的上下文 问题:即使在SO中搜索了类似的问题,我仍然无法解决问题 数据格式(每张图纸都读入一个数据框): Sheet 1 (db1) Name CUSIP Date Price A XXX 01/01/2001 100 B AAA 02/05/2005
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):
我已经尝试过的:我正在尝试使用merge函数来匹配每个数据帧,但是我在“如何”部分遇到了错误
我也尝试了连接,但是我只得到了一个数据帧列表,而不是一个输出
wsframes = [db1 ,db2, db3]
fnl = pd.concat(wsframes, axis=1)
问题:执行此操作的正确方法是什么?您似乎需要:
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
此处)),否则会得到\ux
和\uy
后缀:
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
您得到了什么错误?合并过程的KeyError:“CUSIP”。对于concat,我得到了数据帧列表,但我无法将它们放在一起进行操作。您的错误表明“CUSIP”作为列不可见。当编写
db1['CUSIP']
或db2['CUSIP']
时,您会得到什么?事实上同样的错误。这可能是因为数据被一个空行从标题中分隔开了吗?关于db2.columns.tolist()
和db2.index.tolist()
我想他已经尝试过合并,但抱怨出现了错误。我认为没有必要使用另一个库,比如functools。他还可以在CUSIP上设置索引并进行合并。@Wli-是的,但是如果需要合并许多数据帧,那么这就更简单了。回答得好~~!
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
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