合并两个pandas数据框(在一个公共列上连接)

时间:2013-09-13 18:29:47

标签: python pandas dataframe merge left-join

我有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,使用pandas中的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)

对于大熊猫来说,我是新手,并且不知道在执行连接语句时我做错了什么。

任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:88)

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

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

on 指定要加入的两个数据框中都存在的字段名称,以及如何 定义它的内/外/左/右连接,外部使用'来自两个帧的键的并集(SQL:全外连接)。由于两个数据框中都有“星形”列,因此默认情况下会在合并的数据框中创建两列star_x和star_y。正如@DanAllan为join方法所提到的,您可以通过将其作为kwarg传递来修改merge的后缀。默认值为suffixes=('_x', '_y')。如果你想做star_restaurant_idstar_restaurant_review之类的事情,你可以这样做:

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

link详细说明了这些参数。

答案 1 :(得分:17)

如果DataFrame有一些共同的列名,则加入失败。最简单的方法是添加lsuffixrsuffix关键字,如下所示:

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

这样,列具有不同的名称。文档addresses this very problem

或者,您可以通过在加入之前删除违规列来解决这个问题。例如,如果restaurant_ids_dataframe中的星号对restaurant_review_frame中的星星多余,则可以del restaurant_ids_dataframe['stars']

答案 2 :(得分:11)

如果有人需要尝试在索引(而不是另一列)上合并两个数据帧,这也有效!

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

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

P.S。我不得不使用merge,因为append会不必要地填充NaN。