我有一个带有土地覆盖等级和状态的站点表。我有另一个表,其中的值链接到class和state。但是,在第二个表中,某些行仅链接到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)
我想按class和state链接表,除了值表中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。是否有一种廉价的方法可以做到这一点,而不是分解两个表,执行单独的合并,然后连接结果?
分别合并它们怎么样:
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)