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