对于数据帧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
请注意,date
和df1
的{{1}}中有重复的值。
答案 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
在我看来还不错,这是使用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
答案 2 :(得分:0)
如果您有其他解决方案,这似乎可行。欢迎分享。
df2
输出:
df1.set_index('date').combine_first(df2.set_index('date'))\
.reindex(df1.date)\
.reset_index()