【问题标题】:Complex Dataframe Merge Python Pandas复杂的数据框合并 Python Pandas
【发布时间】:2018-05-01 17:20:31
【问题描述】:

我正在尝试合并 2 个数据帧,但无法完全得到我要查找的内容。

数据框 1 如下所示。

Index       Date      Data1   Data2

  A    2007-07-21      76      32
  A    2007-08-13      nan     23
  B    2007-06-15      53      nan
  B    2007-07-15      87      39

数据框 2 如下所示:

Index       Date      Data3   Data4

  A    2007-07-24      14      nan
  A    2007-08-13      67      51
  B    2007-06-21      32      36
  B    2007-07-15      nan     91

两个数据帧中的索引相同。索引标签包含重复项。日期有一些重叠,但每个数据框也包含唯一的日期。

我想要的结果如下:具有相同索引和日期的行在结果中出现一次,并具有组合值(Data1、Data2、Data3、Data4)。如果索引/日期组合在左侧数据帧或右侧数据帧中出现一次,则该组合将与来自相应数据帧的相关数据和不存在值的数据帧列中的 nan 一起出现。

从上述数据帧中,结果将如下所示:

Index       Date      Data1   Data2  Data3  Data4

  A    2007-07-21      76      32     nan    nan
  A    2007-07-24      nan     nan    14     nan  
  A    2007-08-13      nan     23     67      51
  B    2007-06-15      53      nan    nan    nan
  B    2007-06-21      nan     nan    32      36
  B    2007-07-15      87      39     nan     91

这个练习包含左连接和外连接。不知道如何使用 pd.merge 或 pd.concat 来获得它。

提前感谢您的洞察力。

【问题讨论】:

    标签: python pandas merge concat


    【解决方案1】:

    set_index + concat

    pd.concat([df1.set_index(['Index','Date']),df2.set_index(['Index','Date'])],1).reset_index()
    Out[1145]: 
      Index        Date  Data1  Data2  Data3  Data4
    0     A  2007-07-21   76.0   32.0    NaN    NaN
    1     A  2007-07-24    NaN    NaN   14.0    NaN
    2     A  2007-08-13    NaN   23.0   67.0   51.0
    3     B  2007-06-15   53.0    NaN    NaN    NaN
    4     B  2007-06-21    NaN    NaN   32.0   36.0
    5     B  2007-07-15   87.0   39.0    NaN   91.0
    

    或者我们可以使用merge

    df1.merge(df2,on=['Index','Date'],how='outer')
    Out[1147]: 
      Index        Date  Data1  Data2  Data3  Data4
    0     A  2007-07-21   76.0   32.0    NaN    NaN
    1     A  2007-08-13    NaN   23.0   67.0   51.0
    2     B  2007-06-15   53.0    NaN    NaN    NaN
    3     B  2007-07-15   87.0   39.0    NaN   91.0
    4     A  2007-07-24    NaN    NaN   14.0    NaN
    5     B  2007-06-21    NaN    NaN   32.0   36.0
    

    【讨论】:

    • 感谢您的快速回复。外连接通常会合并具有公共索引值的元素吗?另外,在您的 concat 示例中,默认的“如何”是什么?
    • @Windstorm1981,默认为how='inner'
    • @MaxU:如果使用 concat 默认是内连接,那么不应该采用您对两个数据帧通用的组/日期组合并忽略每个数据帧唯一的组/日期组合(例如,采取数据框的交集?)
    • @Windstorm1981,我的回答是关于merge,而不是关于concatpd.concat(..., join='outer')
    • 哦,我想知道 concat 示例中使用的方法,因为它没有指定。
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2017-12-16
    • 2017-01-06
    相关资源
    最近更新 更多