2016-04-04 54 views
5

Ho due dataframes, la prima ha 1000 righe e si presenta come:sostituire i valori di colonna in una dataframe dai valori di un'altra dataframe

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 colonna Group ha valori diversi, a volte ripetuto, ma in generale su 50 valori unici.

Il secondo dataframe contiene tutti questi 50 valori unici (50 righe) e anche le strutture, che sono associati a questi valori:

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

Il mio obiettivo è quello di sostituire il valore nella colonna Group del primo dataframe dai valori corrispondenti della colonna Hotel del secondo dataframe/o creare la colonna Hotel con i valori corrispondenti. Quando provo a farlo solo con l'assegnazione come

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

ho un errore che i dataframes non sono di pari dimensioni, in modo che il confronto non è possibile

risposta

9

Se si imposta l'indice del 'gruppo' colonna d'altra df allora si può sostituire con map sul df originale colonna 'Gruppo':

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 
+0

quando faccio questo, ricevo un messaggio di errore, qualche idea del perché? InvalidIndexError: Reindexing valido solo con oggetti Index con valore univoco – mkheifetz

+1

Se non si dispone di valori univoci nella colonna, non è possibile impostare l'indice su di esso – EdChum

+0

hmmm, quindi cosa devo fare se ho un enorme dataframe dove voglio tutti le colonne (le colonne non sono univoche come hai appena dichiarato tu stesso) per raccogliere i valori che corrispondono ai valori in una colonna in un altro dataframe? – mkheifetz

0

si potrebbe anche creare un dizionario e uso applicare:

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