2

我有两个数据框,如下所示

op1 = pd.DataFrame({
   'subject_id':[1,1,1,1,1,1],
   'date' : ['1/1/2017','1/2/2017','1/3/2017','1/4/2017','1/5/2017','1/6/2017'],
    'val' :[5,10,5,16,26,6]
 })

op2 = pd.DataFrame({
      'subject_id':[1,1,1,1,1,1,1],
      'date' : ['1/1/2017','1/2/2017','1/3/2017','1/4/2017','1/5/2017','1/6/2017','1/7/2017'],
      'val' :[5,1,15,6,2,6,8]
  })

我想从中复制记录op2(其中不存在op1)并将其放入最终数据帧中d。所以NaNs对于val记录中的记录是由记录op1填充的。所以我想合并记录。这是我尝试过的,但它不起作用valop2where val is NaN

d = op1.merge(op2, on = ['subject_id','date'],how='outer')
d[d['val_x'].isna()]['val_x'] = d['val_y']

我希望我的输出如下所示

在此处输入图像描述

4

2 回答 2

3

添加参数,然后用提取列suffixes替换缺失值:fillnapop

d = op1.merge(op2, on = ['subject_id','date'],how='outer', suffixes=('','_'))
d['val'] = d['val'].fillna(d.pop('val_'))

print (d)
   subject_id      date   val
0           1  1/1/2017   5.0
1           1  1/2/2017  10.0
2           1  1/3/2017   5.0
3           1  1/4/2017  16.0
4           1  1/5/2017  26.0
5           1  1/6/2017   6.0
6           1  1/7/2017   8.0

在您的解决方案中可以使用:

d.loc[d['val'].isna(), 'val'] = d['val_']
于 2019-09-02T07:30:15.653 回答
2

或者您也可以combine_first通过设置['subject_id','date']为索引来使用:

(op1.set_index(['subject_id','date'])
  .combine_first(op2.set_index(['subject_id','date'])).reset_index())

   subject_id      date   val
0           1  1/1/2017   5.0
1           1  1/2/2017  10.0
2           1  1/3/2017   5.0
3           1  1/4/2017  16.0
4           1  1/5/2017  26.0
5           1  1/6/2017   6.0
6           1  1/7/2017   8.0
于 2019-09-02T07:31:16.327 回答