我有一个简单的数据帧像这样:如何将两个数据框与“通配符”合并?
p b
0 a buy
1 b buy
2 a sell
3 b sell
和查找表是这样的:
p b v
0 a buy 123
1 a sell 456
2 a * 888
4 b * 789
如何我可以合并(连接)两个dataframes,但尊重列中的“通配符” b,即预期的结果是:
p b v
0 a buy 123
1 b buy 789
2 a sell 456
3 b sell 789
我能想出这是最好的,但它是相当丑陋,详细:
data = pd.DataFrame([
['a', 'buy'],
['b', 'buy'],
['a', 'sell'],
['b', 'sell'],
], columns = ['p', 'b'])
lookup = pd.DataFrame([
['a', 'buy', 123],
['a', 'sell', 456],
['a', '*', 888],
['b', '*', 789],
], columns = ['p','b', 'v'])
x = data.reset_index()
y1 = pd.merge(x, lookup, on=['p', 'b'], how='left').set_index('index')
y2 = pd.merge(x[y1['v'].isnull()], lookup, on=['p'], how='left').set_index('index')
data['v'] = y1['v'].fillna(y2['v'])
有没有更智能的方法?
在上面的预期结果中,为什么没有任何'v'等于888的行? – unutbu
好问题 - 这是因为通配符只适用于没有更多特定匹配的情况。 – Matthew
@Matthew如果这是你创建的东西,你需要考虑数据模型。 – Merlin