结合两个数据框的大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_id
和star_restaurant_review
,你可以这样做:
pd.merge(restaurant_ids_dataframe, restaurant_review_frame, on='business_id', how='outer', suffixes=('_restaurant_id', '_restaurant_review'))
参数在这个链接里有详细的解释。
如果DataFrame有一些共同的列名,连接将失败。 最简单的方法是包含一个lsuffix
或rsuffix
关键字,如下所示:
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。