Об’єднайте дві рамки даних панд (об’єднайте загальний стовпець)


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.join () у пандах.

Я спробував наступний рядок коду:

#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)

Я дуже новачок у пандах і не маю уявлення, що я роблю неправильно, що стосується виконання заяви про приєднання.

будь-яка допомога буде дуже вдячна.


Пов’язана, більш широка тема злиття панд загалом: Злиття панд 101 .
cs95

Відповіді:


123

Ви можете використовувати злиття, щоб об’єднати два кадри даних в один:

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

where on вказує ім'я поля, яке існує в обох кадрах даних, до якого слід приєднатися, і як визначає, чи приєднується його внутрішнє / зовнішнє / ліве / праве, із зовнішнім використанням 'об'єднання ключів від обох кадрів (SQL: повне зовнішнє об'єднання). Оскільки у вас є стовпець "зірка" в обох кадрах даних, це за замовчуванням створить два стовпці star_x та star_y у комбінованому фреймі даних. Як @DanAllan згадано для методу join, ви можете змінити суфікси для злиття, передавши його як 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'))

Параметри докладно пояснюються за цим посиланням .


1
Ваша порада вирішила мою проблему. Єдиною зміною, яку мені довелося зробити, було те, що я зробив внутрішнє злиття замість зовнішнього. тобто як = 'внутрішній' замість зовнішнього. Спасибі за вашу допомогу.
anonuser0428

2
як = внутрішній | зовнішній | лівий | правий, як об'єднати, перетин ключів ліворуч і праворуч | об'єднати (ВСІ) клавіші лівий і правий | лише ліві клавіші | тільки праві клавіші |
gooithe

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. Я спробував метод join, але все, що я отримую, - це 4503 записи в restaurant_ids_dataframe і нульові записи в стовпцях, що належать до restaurant_review_frame. Не могли б ви повідомити мене, чому це відбувається? Я виконав ліве приєднання, як ви запропонували, скориставшись наведеним вище твердженням, але, здається, з якихось причин мені не видано жодних предметів із restaurant_review_frame. Я шукаю, щоб створити фрейм даних із усіма стовпцями з обох фреймів даних, об’єднаних у business_id. Я також видалив зайві стовпці, крім business_id.
anonuser0428

Якщо ви все ще зацікавлені у вирішенні цієї проблеми, надайте приклад, що дані відтворюють проблему.
Dan Allan

16

Якщо комусь потрібно спробувати об'єднати два кадри даних в індексі (замість іншого стовпця), це також працює!

T1 і T2 - це кадри даних, що мають однакові індекси

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

PS Мені довелося скористатися злиттям, оскільки додаток заповнює NaN без необхідності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.