Объедините два фрейма данных pandas (объедините в общем столбце)

86

У меня есть 2 фрейма данных:

restaurant_ids_dataframe

Data columns (total 13 columns):
business_id      4503  non-null values
categories       4503  non-null values
city             4503  non-null values
full_address     4503  non-null values
latitude         4503  non-null values
longitude        4503  non-null values
name             4503  non-null values
neighborhoods    4503  non-null values
open             4503  non-null values
review_count     4503  non-null values
stars            4503  non-null values
state            4503  non-null values
type             4503  non-null values
dtypes: bool(1), float64(3), int64(1), object(8)`

и

restaurant_review_frame

Int64Index: 158430 entries, 0 to 229905
Data columns (total 8 columns):
business_id    158430  non-null values
date           158430  non-null values
review_id      158430  non-null values
stars          158430  non-null values
text           158430  non-null values
type           158430  non-null values
user_id        158430  non-null values
votes          158430  non-null values
dtypes: int64(1), object(7)

Я хотел бы объединить эти два DataFrames, чтобы превратить их в один dataframe, используя команду DataFrame.join () в pandas.

Я пробовал следующую строку кода:

#the following line of code creates a left join of restaurant_ids_frame and   restaurant_review_frame on the column 'business_id'
restaurant_review_frame.join(other=restaurant_ids_dataframe,on='business_id',how='left')

Но когда я пытаюсь это сделать, я получаю следующую ошибку:

Exception: columns overlap: Index([business_id, stars, type], dtype=object)

Я очень новичок в pandas и понятия не имею, что я делаю не так, что касается выполнения оператора соединения.

Любая помощь приветствуется.

anonuser0428
источник
Связанная, более широкая тема слияния панд в целом: Слияние панд 101 .
CS95

Ответы:

122

Вы можете использовать слияние, чтобы объединить два фрейма данных в один:

import pandas as pd
pd.merge(restaurant_ids_dataframe, restaurant_review_frame, on='business_id', how='outer')

где on указывает имя поля, которое существует в обоих фреймах данных для присоединения, и как определяет, будет ли его внутреннее / внешнее / левое / правое соединение, с внешним использованием «объединения ключей из обоих фреймов (SQL: полное внешнее соединение)». Поскольку у вас есть столбец «звезда» в обоих фреймах данных, это по умолчанию создаст два столбца star_x и star_y в объединенном фрейме данных. Как упоминалось в @DanAllan для метода соединения, вы можете изменить суффиксы для слияния, передав его как kwarg. По умолчанию suffixes=('_x', '_y'). если вы хотите сделать что-то вроде star_restaurant_idи star_restaurant_review, вы можете:

 pd.merge(restaurant_ids_dataframe, restaurant_review_frame, on='business_id', how='outer', suffixes=('_restaurant_id', '_restaurant_review'))

Параметры подробно описаны в этой ссылке .

mlimb
источник
1
Ваш совет решил мою проблему. Единственное изменение, которое мне пришлось внести, - это внутреннее слияние вместо внешнего. т.е. how = 'внутренний' вместо внешнего. Спасибо за вашу помощь.
anonuser0428
2
как = внутренний | внешний | левый | правый, как объединить, пересечение ключей левый и правый | объединение (ВСЕ) ключи левый и правый | только левый ключ | только правый ключ |
gaoithe
22

Присоединение не удается, если у DataFrames есть общие имена столбцов. Самый простой способ обойти это - включить ключевое слово lsuffixили, rsuffixнапример:

restaurant_review_frame.join(restaurant_ids_dataframe, on='business_id', how='left', lsuffix="_review")

Таким образом, столбцы имеют разные имена. Документация решает именно эту проблему .

Или вы можете обойти это, просто удалив проблемные столбцы перед присоединением. Если, например, звезды в restaurant_ids_dataframeизображении не соответствуют звездам в restaurant_review_frame, вы могли бы del restaurant_ids_dataframe['stars'].

Дэн Аллан
источник
в нем также говорится, что столбец business_id перекрывается, разве он не должен перекрываться, поскольку это столбец, для которого я создаю соединение? Как мне решить эту проблему?
anonuser0428
Привет, @DanAllan, я попробовал метод соединения, но все, что я получил, это 4503 записи в restaurant_ids_dataframe и ноль записей в столбцах, принадлежащих restaurant_review_frame. Не могли бы вы сообщить мне, почему это происходит? Я выполнил левое соединение, как вы предложили, используя приведенный выше оператор, но по какой-то причине он не дает мне никаких элементов из restaurant_review_frame. Я ищу создание фрейма данных со всеми столбцами из обоих фреймов данных, объединенных по business_id. Я также удалил лишние столбцы, кроме business_id.
anonuser0428
Если вы все еще заинтересованы в решении этой проблемы, приведите пример, который воспроизводит проблему.
Дэн Аллан
16

Если кому-то нужно попытаться объединить два фрейма данных вместе в индексе (вместо другого столбца), это тоже работает!

T1 и T2 - фреймы данных с одинаковыми индексами

import pandas as pd
T1 = pd.merge(T1, T2, on=T1.index, how='outer')

PS Мне пришлось использовать слияние, потому что добавление без нужды заполняло бы NaN.

Фирас
источник