繁体   English   中英

左合并两个数据框并仅填充 Pandas 中的 NaN 值

[英]Left merge two dataframes and fill only NaN values in Pandas

对于数据帧df1df2 ,我想根据date对它们进行合并以获得df ,如果v1v2有值,则采用它们,否则采用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

请注意df1df2 date存在重复值。

尝试使用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

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

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

df1.set_index('date').combine_first(df2.set_index('date'))\
     .reindex(df1.date)\
     .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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM