Mam prosty dataframe tak:Jak scalić dwie ramki danych z "symbolami wieloznacznymi"?
p b
0 a buy
1 b buy
2 a sell
3 b sell
i tabeli odnośników tak:
p b v
0 a buy 123
1 a sell 456
2 a * 888
4 b * 789
Jak mogę połączyć (join) dwóch dataframes, ale z poszanowaniem 'dziką kartę' w kolumnie b, czyli oczekiwanego wyniku jest:
p b v
0 a buy 123
1 b buy 789
2 a sell 456
3 b sell 789
najlepszym mogę wymyślić to jest, ale jest to dość brzydki i gadatliwy:
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'])
Czy istnieje mądrzejszy sposób?
W oczekiwanym wyniku powyżej, dlaczego nie ma żadnych wierszy z 'v' równym 888? – unutbu
Dobre pytanie - to dlatego, że symbol wieloznaczny obowiązuje tylko wtedy, gdy nie ma dokładniejszego dopasowania. – Matthew
@Matthew, jeśli jest to coś, co stworzyłeś, musisz pomyśleć o modelu danych. – Merlin