【问题标题】:vlookup in Pandas using join在 Pandas 中使用 join 进行 vlookup
【发布时间】:2014-10-19 01:24:55
【问题描述】:

我有以下 2 个数据框

Example1
sku loc flag  
122  61 True 
123  61 True
113  62 True 
122  62 True 
123  62 False
122  63 False
301  63 True 

Example2 
sku dept 
113 a
122 b
123 b
301 c 

我想使用 Pandas(或最好的 Python 运算符)执行合并或连接操作,以生成以下数据框。

Example3
sku loc flag   dept  
122  61 True   b
123  61 True   b
113  62 True   a
122  62 True   b
123  62 False  b
122  63 False  b
301  63 True   c

Both 
df_Example1.join(df_Example2,lsuffix='_ProdHier')
df_Example1.join(df_Example2,how='outer',lsuffix='_ProdHier')

不工作。 我究竟做错了什么?

【问题讨论】:

    标签: python join pandas vlookup


    【解决方案1】:

    执行left 合并,这将使用sku 列作为要加入的列:

    In [26]:
    
    df.merge(df1, on='sku', how='left')
    Out[26]:
       sku  loc   flag dept
    0  122   61   True    b
    1  122   62   True    b
    2  122   63  False    b
    3  123   61   True    b
    4  123   62  False    b
    5  113   62   True    a
    6  301   63   True    c
    

    如果 sku 实际上是您的索引,那么请执行以下操作:

    In [28]:
    
    df.merge(df1, left_index=True, right_index=True, how='left')
    Out[28]:
         loc   flag dept
    sku                 
    113   62   True    a
    122   61   True    b
    122   62   True    b
    122   63  False    b
    123   61   True    b
    123   62  False    b
    301   63   True    c
    

    另一种方法是使用map,如果您将sku 设置为第二个df 的索引,那么实际上它变成了一个系列,那么代码就简化为:

    In [19]:
    
    df['dept']=df.sku.map(df1.dept)
    df
    Out[19]:
       sku  loc   flag dept
    0  122   61   True    b
    1  123   61   True    b
    2  113   62   True    a
    3  122   62   True    b
    4  123   62  False    b
    5  122   63  False    b
    6  301   63   True    c
    

    【讨论】:

      【解决方案2】:

      更通用的应用程序是使用applylambda,如下所示:

      dict1 = {113:'a',
               122:'b',
               123:'b',
               301:'c'}
      
      df = pd.DataFrame([['1', 113],
                         ['2', 113],
                         ['3', 301],
                         ['4', 122],
                         ['5', 113]], columns=['num', 'num_letter'])
      

      添加为新的数据框列

       **df['letter'] = df['num_letter'].apply(lambda x: dict1[x])**
      
        num  num_letter letter
      0   1         113      a
      1   2         113      a
      2   3         301      c
      3   4         122      b
      4   5         113      a
      

      或替换现有的 ('num_letter') 列

       **df['num_letter'] = df['num_letter'].apply(lambda x: dict1[x])**
      
        num num_letter
      0   1          a
      1   2          a
      2   3          c
      3   4          b
      4   5          a
      

      【讨论】:

        【解决方案3】:

        VBA 中的 VLookup 就像 pandas.dataframe.merge

        过去我总是为 VBA 寻找这么多程序,现在 python dataframe 为我节省了大量工作,好在我不需要编写 vlookup 方法。

        pandas.DataFrame.merge

        >>> A              >>> B
            lkey value         rkey value
        0   foo  1         0   foo  5
        1   bar  2         1   bar  6
        2   baz  3         2   qux  7
        3   foo  4         3   bar  8
        >>> A.merge(B, left_on='lkey', right_on='rkey', how='outer')
           lkey  value_x  rkey  value_y
        0  foo   1        foo   5
        1  foo   4        foo   5
        2  bar   2        bar   6
        3  bar   2        bar   8
        4  baz   3        NaN   NaN
        5  NaN   NaN      qux   7
        

        您也可以尝试以下方法进行左合并。

        import pandas as pd
        pd.merge(left, right, left_on = 'key', right_on = 'key', how='left')
        

        outerleft类似于SQL,python的内置类DataFrame有方法merge,带很多args,很详细也很方便。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-19
          • 2019-01-14
          • 2018-03-09
          • 2020-01-01
          • 2020-10-01
          • 2019-10-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多