结合两个数据框的大pandas(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) 

我想join这两个数据框,使用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) 

对于pandas来说,我是一个新手,对于执行联合声明而言,我不知道自己在做什么错误。

任何帮助将非常感激。

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

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

其中on指定两个数据框中存在的字段名称,以及如何定义其内部/外部/左/右联接,外部使用“来自两个框架的键联合(SQL:完全外部联接)”。 由于在这两个数据框中都有“星号”列,因此默认情况下会在组合的数据框中创build两列star_x和star_y。 正如@DanAllan提到的连接方法,您可以通过将其作为kwarg传递来修改合并的后缀。 默认是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')) 

参数在这个链接里有详细的解释。

如果DataFrame有一些共同的列名,连接将失败。 最简单的方法是包含一个lsuffixrsuffix关键字,如下所示:

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

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

或者,您可以通过在join之前简单地删除违规列来解决此问题。 例如,如果restaurant_ids_dataframe中的星星对restaurant_ids_dataframe中的星星是多余的,则可以del restaurant_ids_dataframe['stars']

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

T1和T2是具有相同索引的dataframe

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

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