Reemplace los valores de columna en un dataframe por valores de otro dataframe

Tengo dos marcos de datos, el primero tiene 1000 filas y parece que:

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 columna Group tiene diferentes valores, algunas veces repetidos, pero en general alrededor de 50 valores únicos.

El segundo dataframe contiene todos estos 50 valores únicos (50 filas) y también los hoteles, que están asociados a estos valores:

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

Mi objective es reemplazar el valor en la columna Group de la primera ttwig de datos por los valores correspondientes de la columna Hotel de la segunda ttwig de datos / o crear la columna Hotel con los valores correspondientes. Cuando trato de hacerlo solo por asignacion como

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

Tengo un error que los marcos de datos no son del mismo tamaño, por lo que la comparación no es posible

Si configura el índice en la columna ‘Grupo’ en la otra df, entonces puede reemplazarlo usando el map en su columna original ‘Grupo’ de la df:

 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 

También puedes crear un diccionario y usar aplicar:

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

solo use pandas join, puede consultar el enlace detallado: http://pandas.pydata.org/pandas-docs/stable/merging.html

 df1.join(df2,on='Group') 

Las columnas en pandas DataFrames son solo Series. Haga que los DataFrames (o DataFrame y Series, como se muestra aquí) compartan el mismo índice para que la asignación pueda realizarse desde la Serie al 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 

Observe que el índice de ambos es ‘Grupo’, que permite la asignación.

Si asigna una serie indexada similar a una columna DataFrame, la asignación funciona. Tenga en cuenta que esto funciona a pesar de que hay valores de grupo duplicados en df. No funcionaría si hubiera valores de índice duplicados (con diferentes valores de datos correspondientes) en la serie hotel_groups (por ejemplo, si hubiera dos entradas para el valor de índice hsgc_T2, la primera con el valor de datos Frank y la segunda con el valor de datos Luxy). asignado a df [‘hotel’] (no es que esto ocurra en su ejemplo). Esto no funcionaría porque no habría una manera de saber qué valor asignar a la columna DataFrame indexada similar.