[英]Left merge two dataframes and fill only NaN values in Pandas
对于数据帧df1
和df2
,我想根据date
对它们进行合并以获得df
,如果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
请注意df1
和df2
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
对我来说看起来很好,这是使用concat
和groupby.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.