2017-09-05 1 views
2

j'ai un dataframecolonnes de mappage d'une trame de données à l'autre pour créer une nouvelle colonne

id store address 
1 100  xyz 
2 200  qwe 
3 300  asd 
4 400  zxc 
5 500  bnm 

j'ai un autre dataframe DF2

serialNo store_code warehouse 
    1   300   Land 
    2   500   Sea 
    3   100   Land 
    4   200   Sea 
    5   400   Land 

Je veux que mon dernier dataframe ressembler:

id store address warehouse 
1 100  xyz  Land 
2 200  qwe  Sea 
3 300  asd  Land 
4 400  zxc  Land 
5 500  bnm  Sea 

c'est-à-dire la carte d'une base de données à une autre créant une nouvelle colonne

Répondre

2

Option 1

utilisation df.merge

out = df1.merge(df2, left_on='store', right_on='store_code')\ 
         [['id', 'store', 'address', 'warehouse']] 
print(out) 

    id store address warehouse 
0 1 100  xyz  Land 
1 2 200  qwe  Sea 
2 3 300  asd  Land 
3 4 400  zxc  Land 
4 5 500  bnm  Sea 

Option 2

En utilisant pd.concat et df.sort_values

out = pd.concat([df1.sort_values('store'),\ 
     df2.sort_values('store_code')[['warehouse']].reset_index(drop=1)], 1) 
print(out) 

    id store address warehouse 
0 1 100  xyz  Land 
1 2 200  qwe  Sea 
2 3 300  asd  Land 
3 4 400  zxc  Land 
4 5 500  bnm  Sea 

Le premier appel de tri est redondant en supposant votre dataframe déjà triée sur store, dans ce cas, vous pouvez l'enlever.


Option 3

En utilisant df.replace

s = df1.store.replace(df2.set_index('store_code')['warehouse']) 
print(s) 
0 Land 
1  Sea 
2 Land 
3 Land 
4  Sea 

df1['warehouse'] = s 
print(df1) 

    id store address warehouse 
0 1 100  xyz  Land 
1 2 200  qwe  Sea 
2 3 300  asd  Land 
3 4 400  zxc  Land 
4 5 500  bnm  Sea 

Vous pouvez également créer un mappage explicitement. Cela fonctionne si vous voulez l'utiliser plus tard.

mapping = dict(df2[['store_code', 'warehouse']].values) # separate step 
df1['warehouse'] = df1.store.replace(mapping) # df1.store.map(mapping) 
print(df1) 

    id store address warehouse 
0 1 100  xyz  Land 
1 2 200  qwe  Sea 
2 3 300  asd  Land 
3 4 400  zxc  Land 
4 5 500  bnm  Sea 
1

Utilisation map ou join:

df1['warehouse'] = df1['store'].map(df2.set_index('store_code')['warehouse']) 
print (df1) 
    id store address warehouse 
0 1 100  xyz  Land 
1 2 200  qwe  Sea 
2 3 300  asd  Land 
3 4 400  zxc  Land 
4 5 500  bnm  Sea 

df1 = df1.join(df2.set_index('store_code'), on=['store']).drop('serialNo', 1) 
print (df1) 
    id store address warehouse 
0 1 100  xyz  Land 
1 2 200  qwe  Sea 
2 3 300  asd  Land 
3 4 400  zxc  Land 
4 5 500  bnm  Sea 
+0

Je reçois cette erreur lors de l'exécution du code .map dans un jeu de données similaire. 'Réindexation uniquement valide avec des objets Index de valeur unique' – Shubham

+0

Je pense que vous avez des problèmes de doublons dans' store_code' dans 'df2'. donc besoin de 'df1 ['store']. map (df2.drop_duplicates ('store_code'). set_index ('store_code') ['warehouse'])' – jezrael

+1

correct! Merci :) – Shubham