python search pandas dataframe

python - reemplazar los valores de columna en un marco de datos por valores de otro marco de datos



search pandas (4)

Tengo dos marcos de datos, el primero tiene 1000 filas y se ve así:

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 valores diferentes, a veces repetidos, pero en general unos 50 valores únicos.

El segundo marco de datos 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 objetivo es reemplazar el valor en el Group de columnas del primer marco de datos por los valores correspondientes de la columna Hotel del segundo marco de datos / o crear la columna Hotel con los valores correspondientes. Cuando trato de hacerlo solo por tarea como

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

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


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 ocurrir 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 a una columna de Marco de datos, 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 que está siendo 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 de índice similar.


Si configura el índice en la columna ''Grupo'' en el otro df, puede reemplazarlo usando el map en su columna original ''Grupo'' de 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 puede crear un diccionario y usar apply:

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