Ho un semplice dataframe in questo modo:Come posso unire due dataframe con 'caratteri jolly'?
p b
0 a buy
1 b buy
2 a sell
3 b sell
e una tabella di ricerca come questa:
p b v
0 a buy 123
1 a sell 456
2 a * 888
4 b * 789
Come posso unire (join) i due dataframes, ma rispettando il 'jolly' nella colonna B, vale a dire il risultato atteso è:
p b v
0 a buy 123
1 b buy 789
2 a sell 456
3 b sell 789
il meglio che posso venire in mente è questo, ma è piuttosto brutto e verbose:
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'])
C'è un modo più intelligente?
Nel risultato atteso sopra, perché non ci sono i file con 'V pari a 888? – unutbu
Buona domanda: è perché il jolly si applica solo quando non c'è una corrispondenza più specifica. – Matthew
@Mattagna se questo è qualcosa che hai creato, devi pensare al modello di dati. – Merlin