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


у меня есть 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)

Я хотел бы объединить эти два фрейма данных, чтобы сделать их в один фрейм данных с помощью фрейма данных.команда 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)

Я очень новичок в панд и нет подсказка, что я делаю неправильно, насколько это касается выполнения инструкции join.

любая помощь была бы очень признательна.

3 51

3 ответа:

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

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

здесь on указывает имя поля, которое существует в обоих кадрах данных для объединения, и как определяет, будет ли его внутреннее/внешнее/левое/правое соединение, с внешним использованием ' union ключей из обоих фреймов (SQL: full outer join)."Поскольку у вас есть столбец "звезда" в обоих кадрах данных, это по умолчанию создаст два столбца star_x и star_y в объединенном кадре данных. Как @DanAllan упомянутый для метода join, вы можете изменить суффиксы для слияния, передав его как кварг. По умолчанию это 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'))

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

соединение не выполняется, если фреймы данных имеют несколько общих имен столбцов. Самый простой способ обойти это-включить 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'].

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

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

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

P. S. Я должен был использовать слияния, потому что дописывать будет заполнить Нанс в излишне.