在python中组合数据帧

时间:2018-01-18 01:37:25

标签: python pandas dataframe join merge

我有一个数据框:

>>> g.head(15)
Out[13]: 
         Date      S     E          code  Last
0  2017-11-02   22500 2017-11-10       P 195.00
1  2017-11-02   22500 2017-11-10       C 175.00
2  2017-11-02   22375 2017-11-10       P 135.00
3  2017-11-02   22375 2017-11-10       C 245.00
4  2017-11-02   22625 2017-11-10       P 230.00
5  2017-11-02   22625 2017-11-10       C 125.00
6  2017-11-06   22500 2017-11-10       P 100.00
7  2017-11-06   22500 2017-11-10       C 180.00
8  2017-11-06   22375 2017-11-10       P  60.00
9  2017-11-06   22375 2017-11-10       C 270.00
10 2017-11-06   22625 2017-11-10       P 170.00
11 2017-11-06   22625 2017-11-10       C 120.00
12 2017-11-07   22500 2017-11-10       P  20.00
13 2017-11-07   22500 2017-11-10       C 495.00
14 2017-11-07   22375 2017-11-10       P  13.00

上述数据框在每个日期都有值。我有另一个数据框,其中包含来自上述DF的日期子集,但还有一个名为Q的列。

>>> g1
Out[18]: 
        Date    S     E            code  Last        Q
0 2017-11-10   22500 2017-11-17       P 170.00     828.47
1 2017-11-10   22625 2017-11-17       P 180.00     646.91
2 2017-11-10   22750 2017-11-17       C 145.00     651.84
3 2017-11-17   22250 2017-11-24       P 165.00     707.57
4 2017-11-17   22375 2017-11-24       P 195.00     607.16
5 2017-11-17   22500 2017-11-24       C 175.00     666.56
6 2017-11-24   22375 2017-12-01       P 140.00     834.13
7 2017-11-24   22500 2017-12-01       P 185.00     763.76
8 2017-11-24   22625 2017-12-01       C 165.00     750.45

请注意,g每个日期有6个条目 - 每个S有3个不同的S值和2个不同的代码值,而g1只有3个(每个S只有一个代码)。

现在我想通过以下方式从这两个数据框中选择数据:

  1. 开始日期= g1
  2. 中的每个日期
  3. 结束日期=下次开始日期之前的日期
  4. 对于开始日期和结束日期之间的所有日期,从g中选择数据,但仅针对在g1中选择的S值和代码的组合。
  5. 到此选定数据,为Q添加值,这些值对于从开始到结束日期的每个S /代码组合是恒定的。
  6. 我决定首先进行合并/追加部分:

    h = g.set_index(['Date','S','E','code'])
    h1 = g1.set_index(['Date','S','E','code'])
    f = h.merge(pd.DataFrame(h1['Q']), how= 'left',left_index= True, right_index= True )
    f_final = f.reset_index()
    

    现在我需要:

    1. 从此df中删除S / E /代码组合而不是g1
    2. 根据S / E /代码组合填写Nans的前向填充值
    3. 最好的方法是什么?我应该避免作为我在这里做的第一步吗?

0 个答案:

没有答案