web-dev-qa-db-fra.com

remplacer les valeurs de colonne dans une base de données par les valeurs d'une autre base de données

J'ai deux dataframes, le premier a 1000 lignes et ressemble à:

Date            Group         Family       Bonus
2011-06-09      tri23_1       Laavin       456
2011-07-09      hsgç_T2       Grendy       679
2011-09-10      bbbj-1Y_jn    Fantol       431
2011-11-02      hsgç_T2       Gondow       569

La colonne Group a des valeurs différentes, parfois répétées, mais en général environ 50 valeurs uniques.

La deuxième trame de données contient toutes ces 50 valeurs uniques (50 lignes) ainsi que les hôtels associés à ces valeurs:

Group             Hotel
tri23_1           Jamel
hsgç_T2           Frank
bbbj-1Y_jn        Luxy
mlkl_781          Grand Hotel
vchs_94           Vancouver

Mon objectif est de remplacer la valeur de la colonne Group du premier cadre de données par les valeurs correspondantes de la colonne Hotel du deuxième cadre de données/ou de créer la colonne Hotel avec les valeurs correspondantes. Quand j'essaie de le faire simplement par cession comme 

df1.loc[(df1.Group=df2.Group), 'Hotel']=df2.Hotel

J'ai une erreur que les cadres de données ne sont pas de taille égale, donc la comparaison n'est pas possible

15
Amanda

Si vous définissez l'index sur la colonne "Groupe" de l'autre df, vous pouvez remplacer à l'aide de map sur votre colonne df "Groupe" d'origine:

In [36]:
df['Group'] = df['Group'].map(df1.set_index('Group')['Hotel'])
df

Out[36]:
         Date  Group  Family  Bonus
0  2011-06-09  Jamel  Laavin    456
1  2011-07-09  Frank  Grendy    679
2  2011-09-10   Luxy  Fantol    431
3  2011-11-02  Frank  Gondow    569
21
EdChum

Vous pouvez également créer un dictionnaire et utiliser apply:

hotel_dict = df2.set_index('Group').to_dict()
df1['Group'] = df1['Group'].apply(lambda x: hotel_dict[x])
1
Greg Friedman

il suffit d’utiliser pandas join, vous pouvez vous référer au lien de détail: http://pandas.pydata.org/pandas-docs/stable/merging.html

df1.join(df2,on='Group')
1
176coding

Colonnes dans les pandas Les DataFrames ne sont que des séries. Assurez-vous que les DataFrames (ou DataFrame et Series, comme indiqué ici) partagent le même index afin qu'une affectation puisse se produire entre Series et DataFrame:

**In:**

df = pd.DataFrame(data=
{'date': ['2011-06-09', '2011-07-09', '2011-09-10', '2011-11-02'], 
'family': ['Laavin', 'Grendy', 'Fantol', 'Gondow'], 
'bonus': ['456', '679', '431', '569']}, 
index=pd.Index(name='Group', data=['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2']))

**Out:**
            date    family  bonus
Group           
tri23_1 2011-06-09  Laavin  456
hsgç_T2 2011-07-09  Grendy  679
bbbj-1Y_jn  2011-09-10  Fantol  431
hsgç_T2 2011-11-02  Gondow  569

**In:**

hotel_groups = pd.Series(['Jamel', 'Frank', 'Luxy', 'Grand Hotel', 'Vancouver'], 
index=pd.Index(name='Group', data=['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'mlkl_781', 'vchs_94']))

**Out:**

Group
tri23_1             Jamel
hsgç_T2             Frank
bbbj-1Y_jn           Luxy
mlkl_781      Grand Hotel
vchs_94         Vancouver
dtype: object

**In:**

df['hotel'] = hotel_groups

**Out:**

            date    family  bonus hotel
Group               
tri23_1 2011-06-09  Laavin  456 Jamel
hsgç_T2 2011-07-09  Grendy  679 Frank
bbbj-1Y_jn  2011-09-10  Fantol  431 Luxy
hsgç_T2 2011-11-02  Gondow  569 Frank

Notez que l'index des deux est 'Group', ce qui permet l'affectation. 

Si vous affectez une série ayant le même index à une colonne DataFrame, l'affectation fonctionne. Notez que cela fonctionne malgré la présence de valeurs de groupe en double dans df. Cela ne fonctionnerait pas s'il y avait des valeurs d'index dupliquées (avec des valeurs de données correspondantes différentes) dans la série hotel_groups (par exemple, s'il y avait deux entrées pour la valeur d'index hsgc_T2, la première avec la valeur de données Frank et la seconde avec la valeur de données Luxy en cours assigné à df ['hotel'] (même si cela ne se produirait jamais dans votre exemple). Cela ne fonctionnerait pas car il n'y aurait pas moyen de savoir quelle valeur attribuer la colonne DataFrame à index similaire. 

0
Erik Christiansen