在Pandas中使用join加入vlookup

Ale*_*man 36 python join vlookup pandas

我有以下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 
Run Code Online (Sandbox Code Playgroud)

我想使用Pandas(或最好的Python运算符)执行合并或加入opertation来生成以下数据框.

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')
Run Code Online (Sandbox Code Playgroud)

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

EdC*_*ica 62

执行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
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用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
Run Code Online (Sandbox Code Playgroud)


Ami*_*r F 6

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

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'])
Run Code Online (Sandbox Code Playgroud)

添加为新的数据框列

 **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
Run Code Online (Sandbox Code Playgroud)

或者替换现有的 ('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
Run Code Online (Sandbox Code Playgroud)