Python 2.7 基于循环并比较其他数据帧中的列来创建新的数据帧
我有两个数据帧(df1)和(df2),如下所示: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
--------------------------------
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