【问题标题】:How to use multiple where conditions during pandas merge如何在 pandas 合并期间使用多个 where 条件
【发布时间】:2020-01-05 06:05:10
【问题描述】:

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

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]
  })

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

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

我希望我的输出如下所示

【问题讨论】:

  • 以下两个答案都非常好。基于我对 Python 的有限熟练度,我标记了简单而简短的答案。我真的不知道这两个答案的复杂性。所以我只能标记一个。除非作者自己希望推荐一个而不是另一个。我喜欢这两个答案。感谢您的帮助

标签: python python-3.x pandas dataframe merge


【解决方案1】:

添加参数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_']

【讨论】:

    【解决方案2】:

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

    (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
    

    【讨论】:

    • 对于 combine_first,数据框是否必须具有相同的形状?我的意思是行数相等?
    • 如果必须替换NaN,则必须在下一个数据帧中查找相同的行索引值
    • @SSMK 否,所以无论 df2 中缺少什么索引,它都会带到 df1 ,所以我们将 ['subject_id','date'] 设置为匹配的索引 :) 然后重置索引以恢复原始形式
    • 当然。正在读那个。它只是没有真正做任何事情。只需避免重复值(仅保留第一次出现)并从op2 数据帧中获取新值。我说的对吗?
    • 它匹配2个数据帧的索引并将不匹配的索引值从df2组合到df1,如果df1中的匹配索引具有NaN,它将来自同一索引的值从df2带到df1 @ SSMK
    猜你喜欢
    • 1970-01-01
    • 2021-04-23
    • 2016-01-19
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2015-07-02
    • 2017-12-30
    相关资源
    最近更新 更多