复杂数据框合并Python Pandas

时间:2017-11-17 20:45:40

标签: python pandas merge concat

我正在尝试合并2个数据框,并且无法获得我想要的内容。

Dataframe 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

Dataframe 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

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

我在结果中的含义如下:具有相同索引和日期的行在结果中显示ONCE,并带有组合值(Data1,Data2,Data3,Data4)。如果索引/日期组合在左侧数据框或右侧数据框中出现一次,则该组合与来自相应数据框的相关数据一起显示,并且在数据框中的列中显示不存在值的组合。

从上面的数据框中,结果如下所示:

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来获取它。

提前感谢您的见解。

1 个答案:

答案 0 :(得分:2)

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