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?
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
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
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.
>>> 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.