web-dev-qa-db-fra.com

vlookup in Pandas en utilisant join

J'ai les 2 cadres de données suivants

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 

Je souhaite effectuer une opération de fusion ou de jointure à l'aide de Pandas (ou selon l'opérateur Python est préférable)) pour générer le bloc de données ci-dessous.

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')

Ça ne marche pas. Qu'est-ce que je fais mal?

35
Alex Kinman

Effectuez une fusion left. Cette colonne utilisera la colonne sku comme colonne à rejoindre:

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

Si sku est en fait votre index, procédez comme suit:

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

Une autre méthode consiste à utiliser map, si vous définissez sku comme index sur votre deuxième df, de sorte qu'il devienne une série, le code se simplifie comme suit:

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
60
EdChum

Une application plus générique consisterait à utiliser apply et lambda comme suit:

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'])

Ajouter comme nouvelle colonne de données

 **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

OU remplacer la colonne existante ('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
2
Amir F

VLoopup dans VBA est comme pandas.dataframe.merge

Je recherche toujours autant de procédures pour VBA dans le passé et maintenant python dataframe me permet d'économiser beaucoup de travail. Heureusement que je n'ai pas besoin d'écrire une méthode 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

Vous pouvez également essayer ce qui suit pour faire une fusion à gauche.

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

externe ou left agit comme SQL, la classe intégrée de python DataFrame a la méthode fusionne en prenant de nombreux arguments, ce qui est très détaillé et pratique.

1
flowera