2016-11-02 1 views
1

I ont une table contenant les identifiants des bassins versants et les classes d'occupation du sol:Pandas recherche/pivot en utilisant têtes de colonne

WatershedID LandCover 
      2  Corn 
      8  Corn 
      2  Soy 
      8  Soy 

et une table de consultation séparée qui contient la zone de chaque couvercle bassin versant/terre combinaison:

WatershedID Corn Soy 
      2 14 1 
      3  2 14 
      5 18 8 
      7 21 2 
      8  6 31 

Ce que je voudrais faire est d'ajouter une colonne à la première table qui contient la valeur de la ligne/colonne correspondante dans la table de consultation, comme ceci:

WatershedID LandCover Area 
      2  Corn  14 
      8  Corn  6 
      2  Soy  1 
      8  Soy  31 

J'ai réussi à le faire en itérer avec une boucle:

areas = [] 
for watershed_id, land_cover in tableA.iterrows(): 
    areas.append(tableB.loc[watershed_id][land_cover] 

mais étant donné la taille de mes tables, cela est lent. Existe-t-il un moyen plus rapide de faire cela qui n'implique pas l'itération? J'ai expérimenté avec MultiIndexing et les tableaux croisés dynamiques, mais rien n'a fonctionné jusqu'ici.

Répondre

2

Vous pouvez utiliser unstack avec merge:

df3 = df2.set_index('WatershedID').unstack().reset_index() 
df3.columns = ['LandCover','WatershedID','Area'] 
print (df3) 
    LandCover WatershedID Area 
0  Corn   2 14 
1  Corn   3  2 
2  Corn   5 18 
3  Corn   7 21 
4  Corn   8  6 
5  Soy   2  1 
6  Soy   3 14 
7  Soy   5  8 
8  Soy   7  2 
9  Soy   8 31 

print (pd.merge(df1,df3)) 
    WatershedID LandCover Area 
0   2  Corn 14 
1   8  Corn  6 
2   2  Soy  1 
3   8  Soy 31 

S'il y a plus mêmes colonnes que vous avez besoin de spécifier des colonnes pour rejoindre:

print (pd.merge(df1,df3, on=['WatershedID','LandCover'])) 
    WatershedID LandCover Area 
0   2  Corn 14 
1   8  Corn  6 
2   2  Soy  1 
3   8  Soy 31 
+0

solution élégante, merci! – triphook