Excel 喜欢在某些条件下使用 python pandas 的 vlookup

Excel like vlookup using python pandas with some conditions

我需要像 Excel 那样在某些条件下使用 python/pandas 对数据帧执行 vlookup。

条件:-

  1. 我需要使用像 vlookup 一样的 Excel 在我的第二个 DataFrame 中创建一个新列 (DFM)。

  2. 如果 DFM 值为 na,则在第二个 Dataframe 的 DFM 中打印 100%。就像下面的结果数据。

  3. 在结果数据 DFM 列中,我只需要对前 10 行应用 vlookup。然后从第 11 行开始,我想一次又一次地复制前 10 行数据,但每次都在删除第一行之后。请看下面的结果示例。由于我们将在每次迭代中删除第一行,因此最后一行将是空的,因此我们需要按照条件 2 中给出的那样打印 100%。

第一个数据帧:-

  S.No     Cal     Date             DFM
  1            8       01-03-2013   100.00%
  1            7       01-06-2013   100.00%
  1            6       01-09-2013   100.00%
  1            5       01-12-2013   99.99%
  1            4       01-03-2014   99.97%
  1            3       01-06-2014   99.95%
  1            2       01-09-2014   98.89%
  1            1      01-12-2014   39.36%
  1            0      01-03-2015   0.00%
  1            0      01-06-2015   0.00%
  1            0      01-09-2015   0.00%
  1            0      01-12-2015   0.00%
  1            8      01-03-2013   100.00%
  1            7      01-06-2013   100.00%
  1            6      01-09-2013   100.00%
  1            5      01-12-2013   99.99%
  1            4      01-03-2014   99.97%
  1            3      01-06-2014   99.95%
  1            2      01-09-2014   98.89%
  1            1      01-12-2014   39.36%
  1            0      01-03-2015   0.00%
  1            0      01-06-2015   0.00%
  1            0      01-09-2015   0.00%
  1            0      01-12-2015   0.00%
  1            8      01-03-2013   100.00%
  1            7      01-06-2013   100.00%
  1            6      01-09-2013   100.00%
  1            5      01-12-2013   99.99%
  1            4      01-03-2014   99.97%
  1            3      01-06-2014   99.95%
  1            2      01-09-2014   98.89%
  1            1      01-12-2014   39.36%
  1            0      01-03-2015   0.00%
  1            0      01-06-2015   0.00%
  1            0      01-09-2015   0.00%
  1            0      01-12-2015   0.00%
  

第二个数据帧:-

      Cal     Group        
        1     period 1    
        2     period 1    
        3     period 1    
        4     period 1   
        5     period 1    
        6     period 1    
        7     period 1    
        8     period 1    
        9     period 1    
       10    period 1         
        1     period 1    
        2     period 1    
        3     period 1    
        4     period 1   
        5     period 1    
        6     period 1    
        7     period 1    
        8     period 1    
        9     period 1    
       10    period 1        
        1     period 1    
        2     period 1    
        3     period 1    
        4     period 1   
        5     period 1    
        6     period 1    
        7     period 1    
        8     period 1    
        9     period 1    
       10    period 1    

结果:-

        Cal     Group       DFM
         1     period 1    39.36%
         2     period 1    98.89
         3     period 1    99.95%
         4     period 1    99.97%
         5     period 1    99.99%
         6     period 1    100.00%
         7     period 1    100.00%
         8     period 1    100.00%
         9     period 1    100.00%
        10    period 1    100.00%
         1      period 1    98.89
         2     period 1    99.95%
         3     period 1    99.97%
         4     period 1    99.99%
         5     period 1    100.00%
         6     period 1    100.00%
         7     period 1    100.00%
         8     period 1    100.00%
         9     period 1    100.00%
        10    period 1    100.00%
         1     period 1    99.95%
         2     period 1    99.97%
         3     period 1    99.99%
         4     period 1    100.00%
         5     period 1    100.00%
         6     period 1    100.00%
         7     period 1    100.00%
         8    period 1    100.00%
         9    period 1    100.00%
        10    period 1    100.00%
     

在许多编程语言中,vlookup 的等价物是索引 SQL joins. In pandas that's either df.merge() for columns or df.join() 的某种实现。

为了创建移动效果,我连接了每个移动片段的列表。

import pandas as pd

df1 = pd.read_csv("temp/df1.csv").drop_duplicates()
df2 = pd.read_csv("temp/df2.csv").drop_duplicates()

vlookuped = (df2.merge(df1, how="left", on=["Cal"])
             .drop(columns=["S.No", "Date"]))

result = (
    pd.concat([
        vlookuped,
        vlookuped.assign(DFM=lambda x: x["DFM"].shift(-1)),
        vlookuped.assign(DFM=lambda x: x["DFM"].shift(-2))],
        ignore_index=True)
    .fillna("100.00%"))

此代码生成以下数据帧:

Cal    Group     DFM
  1 period 1  39.36%
  2 period 1  98.89%
  3 period 1  99.95%
  4 period 1  99.97%
  5 period 1  99.99%
  6 period 1 100.00%
  7 period 1 100.00%
  8 period 1 100.00%
  9 period 1 100.00%
 10 period 1 100.00%
  1 period 1  98.89%
  2 period 1  99.95%
  3 period 1  99.97%
  4 period 1  99.99%
  5 period 1 100.00%
  6 period 1 100.00%
  7 period 1 100.00%
  8 period 1 100.00%
  9 period 1 100.00%
 10 period 1 100.00%
  1 period 1  99.95%
  2 period 1  99.97%
  3 period 1  99.99%
  4 period 1 100.00%
  5 period 1 100.00%
  6 period 1 100.00%
  7 period 1 100.00%
  8 period 1 100.00%
  9 period 1 100.00%
 10 period 1 100.00%