我需要将两个表连接在一起:
例如:
表1
index' (GBP, USD) (USD, RUB) etc...
2019-07-01 1.1 62 ...
2019-07-02 1.2 63 ...
2019-07-03 1.3 64 ...
表2
date pair
2019-07-01 GBP, USD
2019-07-01 USD, RUB
2019-07-02 GBP, USD
2019-07-02 USD, RUB
目标是添加某种联接,以在表2中创建一个新列,以在表1中显示速率。
最终
date pair Rate
2019-07-01 GBP, USD 1.1
2019-07-01 USD, RUB 62
2019-07-02 GBP, USD 1.2
2019-07-02 USD, RUB 63
我尝试了pd.merge的一些变体,但可以得到我想要的东西。也许需要做一些不同的事情?
答案 0 :(得分:2)
这需要先进行一些清理。 tbl1
必须采用长格式,我们需要确保这些列是元组,而不是看起来像元组的字符串。
fx = tbl1.stack().rename_axis(['date', 'pair']).reset_index(name='FX')
fx['pair'] = fx['pair'].str[1:-1].str.split(', ').map(tuple)
fx
date pair FX
0 2019-07-01 (GBP, USD) 1.1
1 2019-07-01 (USD, RUB) 62.0
2 2019-07-02 (GBP, USD) 1.2
3 2019-07-02 (USD, RUB) 63.0
4 2019-07-03 (GBP, USD) 1.3
5 2019-07-03 (USD, RUB) 64.0
或者不理会列并修复
tbl1.columns = tbl1.columns.str[1:-1].str.split(', ').map(tuple)
tbl1
GBP USD
USD RUB
index
2019-07-01 1.1 62
2019-07-02 1.2 63
2019-07-03 1.3 64
tbl2
需要确保pair
列是元组,而不是看起来像元组的字符串。
tbl2 = tbl2.assign(pair=tbl2.pair.str.split(', ').map(tuple))
tbl2
pair
date
2019-07-01 (GBP, USD)
2019-07-01 (USD, RUB)
2019-07-02 (GBP, USD)
2019-07-02 (USD, RUB)
lookup
使用固定的tbl1
tbl2.assign(FX=tbl1.lookup(tbl2.index, tbl2.pair))
pair FX
date
2019-07-01 (GBP, USD) 1.1
2019-07-01 (USD, RUB) 62.0
2019-07-02 (GBP, USD) 1.2
2019-07-02 (USD, RUB) 63.0
pd.merge_asof
使用长格式fx
pd.merge_asof(tbl2, fx, on='date', by='pair')
pair date FX
0 (GBP, USD) 2019-07-01 1.1
1 (USD, RUB) 2019-07-01 62.0
2 (GBP, USD) 2019-07-02 1.2
3 (USD, RUB) 2019-07-02 63.0