合并两个Pandas数据帧,满足两组标准(VLOOKUP EQUIVALENT)

时间:2016-06-09 03:20:59

标签: python-2.7 pandas dataframe merge

基于满足两个标准,我一直在寻找合并两个数据帧的高低。基本上我要做的是从一个数据框到我的主数据框中的vlookup,其中日期和股票代码符号匹配。

我的主数据框架的基本版本df1如下所示。它是2016年5月1日和2016年5月2日帐户中的股票代码。

   Account_Num    Date          Symbol
0     1           2016-05-01    AAPL
1     1           2016-05-01    UA
2     1           2016-05-01    DIS
3     2           2016-05-01    CVX
4     2           2016-05-01    GOOGL
5     2           2016-05-01    PX
6     3           2016-05-01    MOS
7     3           2016-05-01    BLK
8     3           2016-05-01    TMO
9     1           2016-05-02    AAPL
10    1           2016-05-02    UA
11    1           2016-05-02    DIS
12    2           2016-05-02    CVX
13    2           2016-05-02    GOOGL
14    2           2016-05-02    PX
15    3           2016-05-02    MOS
16    3           2016-05-02    BLK
17    3           2016-05-02    TMO

我的第二个数据框df2保存了2016年5月1日和2016年5月2日上述账户中股票的价格,如下所示(制成价格):

   Date          Symbol   Price
0    2016-05-01    AAPL     99.02
1    2016-05-02    AAPL     94.00
2    2016-05-01    UA       43.00  
3    2016-05-02    UA       40.67
4    2016-05-01    DIS      67.88
5    2016-05-02    DIS      70.03
6    2016-05-01    CVX      22.00
7    2016-05-02    CVX      24.47
8    2016-05-01    GOOGL    85.52
9    2016-05-02    GOOGL    84.33
10   2016-05-01    PX       44.22
11   2016-05-02    PX       47.16
12   2016-05-01    MOS      23.77
13   2016-05-02    MOS      21.56
14   2016-05-01    BLK      38.48
15   2016-05-02    BLK      41.22
16   2016-05-01    TMO      67.43
17   2016-05-02    TMO      65.11

我最终想要的是df3,如下所示:

   Account_Num    Date          Symbol    Price
0      1           2016-05-01    AAPL      99.02  
1      1           2016-05-01    UA        43.00
2      1           2016-05-01    DIS       67.88
3      2           2016-05-01    CVX       22.00
4      2           2016-05-01    GOOGL     85.52
5      2           2016-05-01    PX        44.22
6      3           2016-05-01    MOS       23.77
7      3           2016-05-01    BLK       38.48
8      3           2016-05-01    TMO       67.43
9      1           2016-05-02    AAPL      94.00
10     1           2016-05-02    UA        40.67
11     1           2016-05-02    DIS       70.03
12     2           2016-05-02    CVX       24.47
13     2           2016-05-02    GOOGL     84.33
14     2           2016-05-02    PX        47.16
15     3           2016-05-02    MOS       21.56
16     3           2016-05-02    BLK       41.22
17     3           2016-05-02    TMO       65.11

我看到的问题是两个数据帧的长度不同,我的df1有100,000行,而df2有23,000。因此,它不像是使用索引进行一对一匹配。上面的数据框架示例非常基础,因为在实际数据中,不同的账户比其他账户拥有更多的股票。所以我认为需要发生的是我需要遍历df1中的行并从日期和符号匹配的df2中引入价格。

我在Pandas中找到了相当于vlookup的示例,但它仅匹配一个标准,我在寻找匹配的日期和符号,然后在当天提取股票的价格。 / p>

如果有人知道有关如何执行此操作的信息或有任何建议,将非常感谢

谢谢, da4l

2 个答案:

答案 0 :(得分:1)

非常感谢来自@Merlin的提示,我能够通过以下方式做我需要的事情:

#cretaed a new column in both data-frames concatenating the Date and Symbol variables called 'DateSym'

df1['DateSym'] = df1['Date'].map(str) + df1['Symbol']
df1

df2['DateSym'] = df1['Date'].map(str) + df1['Symbol']
df1

#then created df3 by merging the two data-frames using 'DateSym' as the index after rearranging so both data-frames had the new 'DateSym' column on the left 

df3 = df1.merge(df2, on='DateSym', how='left')
df3

答案 1 :(得分:0)

也许这就是你想要的:

<?php
function encrypt ($key,$iv,$str)
{     
  $block=mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
  $padding=$block-(strlen($str) % $block);
  $str.=str_repeat(chr($padding), $padding);  
  $encryptxt=mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$key,$str,MCRYPT_MODE_CBC,$iv);  
  $encryptxt64=base64_encode($encryptxt);
  return $encryptxt64;
}
function decrypt ($key,$iv,$str)
{     
  $block=mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
  $padding=$block-(strlen($str) % $block);
  $str.=str_repeat(chr($padding), $padding);  
  $decryptxt=mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$key,$str,MCRYPT_MODE_CBC,$iv);  
  $decryptxt64=base64_decode($decryptxt);
  return $decryptxt64;
}
echo encrypt("1234567890123456","12345678901234561234567890123456","test")."\n<br/>";
echo decrypt("1234567890123456","12345678901234561234567890123456","xHqKvRQ6FXehOGGMrKoek04146M2l9bv1ScP6C1qCyg=")."\n<br/>";
?>