【问题标题】:Merging Two Pandas Data-frames where two sets of criteria are met (VLOOKUP EQUIVALENT)合并满足两组标准的两个 Pandas 数据框(VLOOKUP EQUIVALENT)
【发布时间】:2016-10-09 12:46:00
【问题描述】:

我一直在搜索基于满足两个标准合并两个数据框的高低。从本质上讲,我要做的是从一个数据帧到我的主数据帧中进行 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 的示例,但它只匹配一个条件,我正在寻找要匹配的日期和符号,然后获取当天的股票价格。

如果有人知道有关如何执行此操作的信息或有任何建议,将不胜感激

谢谢, da4l

【问题讨论】:

  • @da41 - 这里是提示,你需要“加入”两个表。你需要创建一个键来加入这两个表,比如 ->> 2016-05-01AAPL, . 2016-05-01UA...
  • 谢谢@Merlin,我现在就试一试

标签: python-2.7 pandas dataframe merge


【解决方案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

【讨论】:

    【解决方案2】:

    也许这就是你想要的:

    df3 = df1.merge(df2,on=['Symbol','Date'])
    >>> df1.merge(df2,on=['Symbol','Date'])
    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....
    

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 2018-03-14
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      相关资源
      最近更新 更多