【问题标题】:Merge Pandas Dataframe on a column with structured data在具有结构化数据的列上合并 Pandas Dataframe
【发布时间】:2018-01-27 05:08:13
【问题描述】:

场景: 继上一个关于如何将 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)

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

【问题讨论】:

  • 你遇到了什么错误?
  • KeyError: 'CUSIP' 用于合并过程。对于 concat,我得到了数据框列表,但我无法将它们放在一起进行操作。
  • 您的错误表明“CUSIP”作为列不可见。写db1['CUSIP']db2['CUSIP'] 时你会得到什么?
  • 其实同样的错误。这可能是由于数据与标题被一个空行隔开吗?
  • db2.columns.tolist()db2.index.tolist() 怎么样

标签: python pandas dataframe


【解决方案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)),否则得到_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  

【讨论】:

  • 我认为他已经尝试过合并,但抱怨收到错误
  • 我认为没有必要使用另一个库,如 functools。他还可以在 CUSIP 上设置索引并进行合并。
  • @Wli - 是的,但是如果需要合并许多数据帧,那么这更简单。
  • 不错的答案~~!
猜你喜欢
  • 2014-01-18
  • 2019-10-22
  • 2020-06-15
  • 2014-09-28
  • 2017-04-29
  • 2022-12-05
  • 2018-08-08
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多