Заменить значения столбцов в одном фрейме данных значениями другого блока данных

У меня есть два фрейма данных, первый из которых имеет 1000 строк и выглядит так:

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

Столбец Group имеет разные значения, иногда повторяющиеся, но обычно около 50 уникальных значений.

Второй информационный кадр содержит все эти 50 уникальных значений (50 строк), а также отели, которые связаны с этими значениями:

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

Моя цель - заменить значение в столбце Group первого кадра данных соответствующими значениями столбца Hotel второго фрейма данных/или создать столбец Hotel с соответствующими значениями. Когда я пытаюсь сделать это просто по назначению, например

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

У меня есть ошибка, что числовые кадры не имеют одинакового размера, поэтому сравнение невозможно

Ответ 1

Если вы установите индекс в столбец "Группа" на другом df, вы можете заменить с помощью map на ваш оригинальный 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

Ответ 2

Вы также можете создать словарь и использовать его:

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

Ответ 4

Столбцы в пандах DataFrames - это просто серии. Сделайте так, чтобы DataFrames (или DataFrame и Series, как показано здесь) совместно использовали один и тот же индекс, чтобы можно было назначить последовательность из Series в 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

Обратите внимание, что индексом обоих является "Группа", что позволяет присваивать.

Если вы присваиваете индексированную серию с одинаковым индексом столбцу DataFrame, назначение работает. Обратите внимание, что это работает, несмотря на наличие дублированных значений группы в df. Это не сработало бы, если бы в серии hotel_groups были повторяющиеся значения индекса (с различными соответствующими значениями данных) (например, если были две записи для значения индекса hsgc_T2, первая со значением данных Frank, а вторая со значением данных Luxy, которое используется присваивается df ['hotel'] (не то, чтобы это когда-либо происходило в вашем примере). Это не сработало бы, потому что не было бы способа узнать, какое значение присваивать столбцу DataFrame с аналогичным индексом.

Ответ 5

Это старый вопрос, но есть еще один способ сделать это, он не похож на способ панд, но быстрый

Воспроизведение кадра данных 1 - его необходимо обновить

df_1

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

Воспроизведение фрейма данных 2 - поиск

df_2

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

Получить весь идентификатор отеля (ключевой столбец) из кадра данных 1 в виде списка

key_list = list(df_1['Group'])

['tri23_1', 'hsgç_T2', 'bbbj-1Y_jn', 'hsgç_T2']

Создайте словарь из поискового фрейма данных, который имеет ключ col и значение col

dict_lookup = dict(zip(df_2['Group'], df_2['Hotel']))

{'bbbj-1Y_jn': 'Luxy',
 'hsgç_T2': 'Frank',
 'mlkl_781': 'Grand Hotel',
 'tri23_1': 'Jamel',
 'vchs_94': 'Vancouver'}

Замените значение, создав список, выполнив поиск значения и присвоив столбцу dataframe 1

df_1['Group'] = [dict_lookup[item] for item in key_list]

Обновлен фрейм данных 1

    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