Python 2.7 基于循环并比较其他数据帧中的列来创建新的数据帧

Python 2.7 基于循环并比较其他数据帧中的列来创建新的数据帧,python-2.7,pandas,Python 2.7,Pandas,我有两个数据帧(df1)和(df2),如下所示: df1 -------------------------------- id date value1 value2 -------------------------------- 12 2010-10-09 ABC Value44 13 2011-11-08 CDE Value66 14 2015-10-08 FGH Value41 13 2009-09-10 IJK Val

我有两个数据帧(df1)和(df2),如下所示:

df1
--------------------------------
id     date    value1    value2
--------------------------------
12  2010-10-09  ABC     Value44
13  2011-11-08  CDE     Value66
14  2015-10-08  FGH     Value41
13  2009-09-10  IJK     Value39
14  2010-03-05  LMN     Value29
15  2006-11-12  OPQ     Value33

df2
--------------------------------
id     date    value3    value4
--------------------------------
12  2010-10-09  20        99
15  2006-11-12  50        66
16  2015-10-08  60        41
13  2011-11-08  30        39
15  2010-03-08  50        29
15  2006-11-12  50        33
16  2001-12-04  60        11
12  2009-06-10  20        21
17  2017-10-11  18        22
18  2016-11-11  23        87
我想比较这两个数据帧,并找出每个数据帧的id和date列之间的匹配。如果存在匹配项,则两个数据帧中的id、日期和对应列应成为新数据帧中的一行(即result_df)。如果没有匹配项,但存在id和日期,则应将该id的所有对应列复制到Resu_df中

最后,结果_df应如下所示:

result_df
--------------------------------------------
id     date   value1  value2   value3 value4
--------------------------------------------
12  2010-10-09  ABC  Value44      20    99
12  2009-06-10   NA     NA        20    21  
13  2011-11-08  CDE  Value66      30    39
13  2009-09-10  IJK  Value39      NA    NA
14  2015-10-08  FGH  Value41      NA    NA
14  2010-03-05  LMN  Value29      NA    NA
15  2006-11-12  OPQ  Value33      50    66
15  2006-11-12  OPQ  Value33      50    33
15  2010-03-08   NA    NA         50    29
16  2015-10-08   NA    NA         60    41
16  2001-12-04   NA    NA         60    11
17  2017-10-11   NA    NA         18    22
18  2016-11-11   NA    NA         23    87
我已经使用了.与内部和外部联接合并,但它没有按预期执行,或者可能我没有使用正确的方法。我认为简单的解决方案是使用for循环(因为两个数据帧只有400行要比较),但逻辑似乎让我困惑。有人能帮我吗?谢谢

我认为您可能正在寻找外部合并。 您可以使用
pd.merge(…,how'outer')获得所需的结果。

屈服

    id        date value1   value2  value3  value4
0   12  2010-10-09    ABC  Value44    20.0    99.0
10  12  2009-06-10    NaN      NaN    20.0    21.0 
1   13  2011-11-08    CDE  Value66    30.0    39.0
3   13  2009-09-10    IJK  Value39     NaN     NaN
2   14  2015-10-08    FGH  Value41     NaN     NaN
4   14  2010-03-05    LMN  Value29     NaN     NaN
5   15  2006-11-12    OPQ  Value33    50.0    66.0
6   15  2006-11-12    OPQ  Value33    50.0    33.0
8   15  2010-03-08    NaN      NaN    50.0    29.0
7   16  2015-10-08    NaN      NaN    60.0    41.0
9   16  2001-12-04    NaN      NaN    60.0    11.0
11  17  2017-10-11    NaN      NaN    18.0    22.0
12  18  2016-11-11    NaN      NaN    23.0    87.0

如果列中没有交集,我的解决方案与您的相同?我认为所有没有
id
date
;)的列@unutbu和jezrael,unutbu的解决方案有效。很抱歉,第12个id没有包含一行(应该有两行)。我将编辑我的原始问题,以便为其他读者澄清困惑。谢谢大家!@耶兹雷尔:是的,我认为我们的解决方案在这里产生了相同的结果,但如果除了
id
date
之外还有其他相同的列,则不一定如此。
    id        date value1   value2  value3  value4
0   12  2010-10-09    ABC  Value44    20.0    99.0
10  12  2009-06-10    NaN      NaN    20.0    21.0 
1   13  2011-11-08    CDE  Value66    30.0    39.0
3   13  2009-09-10    IJK  Value39     NaN     NaN
2   14  2015-10-08    FGH  Value41     NaN     NaN
4   14  2010-03-05    LMN  Value29     NaN     NaN
5   15  2006-11-12    OPQ  Value33    50.0    66.0
6   15  2006-11-12    OPQ  Value33    50.0    33.0
8   15  2010-03-08    NaN      NaN    50.0    29.0
7   16  2015-10-08    NaN      NaN    60.0    41.0
9   16  2001-12-04    NaN      NaN    60.0    11.0
11  17  2017-10-11    NaN      NaN    18.0    22.0
12  18  2016-11-11    NaN      NaN    23.0    87.0