合并两个熊猫数据框(在同一列上连接)


83

我有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)

我想使用熊猫中的DataFrame.join()命令将这两个DataFrame合并为一个单独的数据框。

我尝试了以下代码行:

#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语句而言我在做什么错。

任何帮助将非常感激。


有关大熊猫合并的相关更广泛主题:大熊猫合并101
cs95

Answers:


118

您可以使用merge将两个数据帧合并为一个:

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

其中on指定使用两个连接的数据帧中都存在的字段名称,以及如何 定义其内部/外部/左/右连接,而外部使用“来自两个框架的键的统一(SQL:完全外部连接)”。由于两个数据框中都具有“ star”列,因此默认情况下将在组合数据框中创建两列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
您的建议解决了我的问题。我要做的唯一更改是我进行了内部合并而不是外部合并。即how ='inner'而不是external。谢谢你的帮助。
anonuser0428 2013年

2
how = inner | outer | left | right,如何合并,左右键的交点| union(ALL)左右键|仅左键|右键|仅右键|
gaoithe 2015年

21

如果DataFrame具有一些共同的列名,则连接失败。解决这个问题的最简单方法是包含一个lsuffixorrsuffix关键字,如下所示:

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

这样,这些列具有不同的名称。该文档解决了这个问题

或者,您可以通过在加入之前简单地删除有问题的列来解决此问题。例如,如果inrestaurant_ids_dataframe中的星星比in中的星星多余,则restaurant_review_frame可以del restaurant_ids_dataframe['stars']


它还说'business_id'列重叠,不是因为我要在其上创建联接的列而重叠吗?我该如何解决这个问题?
anonuser0428

嘿@DanAllan我尝试了join方法,但是我得到的只是在restaurant_ids_dataframe中的4503条目和在restaurant_review_frame的列中的零条目。您能否让我知道为什么会这样?我已经按照您的建议使用左声明执行了左连接,但是由于某种原因,它似乎没有提供来自restaurant_review_frame的任何物品。我正在寻找的是创建一个数据框,其中包含来自两个数据框的所有列,并加入到business_id上。我还删除了除business_id之外的其他列。
anonuser0428 2013年

如果您仍然有兴趣解决此问题,请提供数据重现问题的示例。
丹·艾伦

16

如果有人需要尝试将索引上的两个数据框合并在一起(而不是另一列),这也可以!

T1和T2是具有相同索引的数据帧

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

PS我必须使用合并,因为append会不必要地填充NaN。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.