Заменить значения столбцов в одном фрейме данных значениями другого блока данных
У меня есть два фрейма данных, первый из которых имеет 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])
Ответ 3
просто используйте pandas join, вы можете обратиться к подробной ссылке: http://pandas.pydata.org/pandas-docs/stable/merging.html
df1.join(df2,on='Group')
Ответ 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