首页 > 解决方案 > Excel like vlookup 在某些条件下使用 python pandas

问题描述

我需要在某些条件下使用 python/pandas 对数据框执行 vlookup,就像在 Excel 中一样。

健康)状况:-

  1. 我需要使用 Excel 之类的 vlookup 在我的第二个 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%
     

标签: pythonpandasnumpyvlookup

解决方案


在许多编程语言中,vlookups 的等价物是SQL 连接的一些实现。在熊猫中,要么df.merge()用于列,要么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%

推荐阅读