熊猫在可变列上合并

tri*_*ook 5 python pandas

我有一个带有土地覆盖等级状态的站点表。我有另一个表,其中的值链接到classstate。但是,在第二个表中,某些行仅链接到class

sites = pd.DataFrame({'id': ['a', 'b', 'c'],
                      'class': [1, 2, 23],
                      'state': ['al', 'ar', 'wy']})

values = pd.DataFrame({'class': [1, 1, 2, 2, 23],
                       'state': ['al', 'ar', 'al', 'ar', None],
                       'val': [10, 11, 12, 13, 16]})
Run Code Online (Sandbox Code Playgroud)

我想按classstate链接表,除了值表中state为 None 的那些行,在这种情况下,它们只能按class链接。

合并具有以下结果:

combined = sites.merge(values, how='left', on=['class', 'state'])

  id  class state   val
0  a      1    al  10.0
1  b      2    ar  13.0
2  c     23    wy   NaN
Run Code Online (Sandbox Code Playgroud)

但我希望最后一行中的val为 16。是否有一种廉价的方法可以做到这一点,而不是分解两个表,执行单独的合并,然后连接结果?

Qua*_*ang 3

分别合并它们怎么样:

pd.concat([sites.merge(values, on=['class','state']),
           sites.merge(values[values['state'].isna()].drop('state',axis=1),
                       on=['class'])
          ])
Run Code Online (Sandbox Code Playgroud)

输出:

  id  class state  val
0  a      1    al   10
1  b      2    ar   13
0  c     23    wy   16
Run Code Online (Sandbox Code Playgroud)