我有一個簡單的數據幀像這樣:如何將兩個數據框與「通配符」合併?
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