İki panda Veri Çerçevesini birleştirin (ortak bir sütunda birleştirin)


86

2 veri çerçevem ​​var:

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

ve

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)

Pandalarda DataFrame.join () komutunu kullanarak bunları tek bir veri çerçevesine dönüştürmek için bu iki DataFrame'i birleştirmek istiyorum.

Aşağıdaki kod satırını denedim:

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

Ancak bunu denediğimde aşağıdaki hatayı alıyorum:

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

Pandalar konusunda çok yeniyim ve birleştirme ifadesini yürütmek söz konusu olduğunda ne yaptığım konusunda hiçbir fikrim yok.

herhangi bir yardım çok takdir edilecektir.


Genel olarak pandaların birleşmesiyle ilgili daha geniş bir konu: Pandas Merging 101 .
cs95

Yanıtlar:


122

İki veri çerçevesini tek bir veri çerçevesinde birleştirmek için birleştirmeyi kullanabilirsiniz :

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

where on , her iki veri çerçevesinde birleştirilecek alan adını belirtir ve dıştaki 'her iki çerçeveden anahtarların birleşimini (SQL: tam dış birleştirme)' kullanarak iç / dış / sol / sağ birleşip birleşmediğini nasıl tanımlar. Her iki veri çerçevesinde de 'yıldız' sütununuz olduğundan, bu varsayılan olarak birleştirilmiş veri çerçevesinde iki sütun star_x ve star_y oluşturacaktır. @DanAllan'ın birleştirme yöntemi için bahsettiği gibi, bir kwarg olarak geçirerek birleştirmek için son ekleri değiştirebilirsiniz. Varsayılan suffixes=('_x', '_y'). star_restaurant_idve gibi bir şey yapmak star_restaurant_reviewistersen şunları yapabilirsin:

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

Parametreler bu bağlantıda ayrıntılı olarak açıklanmıştır .


1
Tavsiyeniz sorunumu çözdü. Yapmam gereken tek değişiklik, dıştan ziyade iç birleştirme yapmamdı. yani nasıl = dış yerine 'iç'. Yardımınız için teşekkürler.
anonuser0428

2
nasıl = iç | dış | sol | sağ, nasıl birleştirilir, sol ve sağ tuşların kesişimi | sol ve sağ birleşim (TÜM) tuşları | yalnızca sol tuşlar | yalnızca sağ tuşlar |
gaoithe

22

DataFrame'lerin ortak bazı sütun adları varsa katılma başarısız olur. Bunu çözmenin en basit yolu, şöyle bir lsuffixveya rsuffixanahtar kelime eklemektir :

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

Bu şekilde sütunların farklı adları olur. Dokümantasyon bu sorunu giderir .

Veya, katılmadan önce rahatsız edici sütunları silerek bu sorunu aşabilirsiniz. Örneğin, içindeki yıldızlar içindeki yıldızlardan restaurant_ids_dataframefazlalıksa restaurant_review_frame, yapabilirsiniz del restaurant_ids_dataframe['stars'].


aynı zamanda 'business_id' sütununun örtüştüğünü söylüyor, üzerinde birleştirmeyi oluşturduğum sütun bu olduğu için örtüşmesi gerekmiyor mu? Bu sorunu nasıl çözerim?
anonuser0428

Hey @DanAllan Join yöntemini denedim ama aldığım tek şey restaurant_ids_dataframe'de 4503 giriş ve restaurant_review_frame'e ait sütunlarda sıfır girdi. Bunun neden olduğunu bana bildirir misin lütfen? Yukarıdaki ifadenizi kullanarak önerdiğiniz gibi bir sol birleştirme gerçekleştirdim, ancak bana restaurant_review_frame'den herhangi bir nedenle herhangi bir öğe vermiyor gibi görünüyor. Benim aradığım şey, business_id'de birleştirilmiş, her iki veri çerçevesinden tüm sütunlarla bir veri çerçevesi oluşturmaktır. Business_id dışındaki ekstra sütunları da sildim.
anonuser0428

Hala bu sorunu çözmekle ilgileniyorsanız, lütfen verilerin sorunu yeniden oluşturduğuna dair bir örnek verin.
Dan Allan

16

Herhangi birinin iki veri çerçevesini dizinde (başka bir sütun yerine) birlikte denemesi ve birleştirmesi gerektiğinde, bu da işe yarar!

T1 ve T2, aynı indekslere sahip veri çerçeveleridir

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

Not: Birleştirme kullanmak zorunda kaldım çünkü eklenti gereksiz yere NaN'leri doldururdu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.