左合并两个数据框,仅填充熊猫的NaN值

时间:2019-12-16 03:42:25

标签: python pandas dataframe

对于数据帧df1df2,如果datedf,我想基于v1合并它们以获得v2有值,然后采用它们,否则采用df2中的值。

df1

      date    v1    v2
0  2017-01  12.0   1.0
1  2017-02   2.0  13.0
2  2017-03  15.0   3.0
3  2017-04   NaN   NaN
4  2017-05   NaN   NaN

df2

      date  v1  v2  v3  v4
0  2017-01  13   9   7   7
1  2017-02   5   7   5  56
2  2017-03  15   8   6   9
3  2017-04  12  14   8   0
4  2017-05   8   8   4   6

刚尝试过,但我得到了:

df = pd.merge(df1, df2, how = 'left', on = 'date')

输出:

      date  v1_x  v2_x  v1_y  v2_y  v3  v4
0  2017-01  12.0   1.0    13     9   7   7
1  2017-02   2.0  13.0     5     7   5  56
2  2017-03  15.0   3.0    15     8   6   9
3  2017-04   NaN   NaN    12    14   8   0
4  2017-05   NaN   NaN     8     8   4   6

如何获得所需的输出,如下所示?谢谢。

      date  v1  v2  v3  v4
0  2017-01  12   1   7   7
1  2017-02   2  13   5  56
2  2017-03  15   3   6   9
3  2017-04  12  14   8   0
4  2017-05   8   8   4   6

请注意,datedf1的{​​{1}}中有重复的值。

3 个答案:

答案 0 :(得分:1)

尝试使用fillna

print(df1.fillna(df2).join(df2[df2.columns.drop(df1.columns)]))

或者只是:

print(df1.fillna(df2).join(df2[['v3', 'v4']]))

两个输出:

      date    v1    v2  v3  v4
0  2017-01  12.0   1.0   7   7
1  2017-02   2.0  13.0   5  56
2  2017-03  15.0   3.0   6   9
3  2017-04  12.0  14.0   8   0
4  2017-05   8.0   8.0   4   6

答案 1 :(得分:1)

combine_first在我看来还不错,这是使用concatgroupby.first()的替代方法:

pd.concat((df1,df2),sort=False).groupby('date').first().reset_index()

      date    v1    v2   v3    v4
0  2017-01  12.0   1.0  7.0   7.0
1  2017-02   2.0  13.0  5.0  56.0
2  2017-03  15.0   3.0  6.0   9.0
3  2017-04  12.0  14.0  8.0   0.0
4  2017-05   8.0   8.0  4.0   6.0

答案 2 :(得分:0)

如果您有其他解决方案,这似乎可行。欢迎分享。

df2

输出:

df1.set_index('date').combine_first(df2.set_index('date'))\
     .reindex(df1.date)\
     .reset_index()