连接python表

时间:2019-07-18 13:51:15

标签: python pandas

我需要将两个表连接在一起:

例如:

表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的一些变体,但可以得到我想要的东西。也许需要做一些不同的事情?

1 个答案:

答案 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