【问题标题】:Combine two pandas Data Frames (join on a common column)合并两个 pandas 数据框(加入一个公共列)
【发布时间】:2013-09-18 12:44:50
【问题描述】:

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

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

我对 pandas 很陌生,就执行 join 语句而言,我不知道我做错了什么。

任何帮助将不胜感激。

【问题讨论】:

标签: python pandas dataframe merge left-join


【解决方案1】:

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

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 传递来修改合并的后缀。默认为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中有详细说明。

【讨论】:

  • 您的建议解决了我的问题。我必须做的唯一改变是我做了一个内部合并而不是外部合并。即 how='inner' 而不是外部。感谢您的帮助。
  • how=inner|outer|left|right, 如何合并,左右键的交集|union(ALL) 左右键|仅左键|仅右键|
  • 为什么使用合并而不是加入?
【解决方案2】:

如果 DataFrames 有一些共同的列名,则加入失败。最简单的解决方法是包含 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']

【讨论】:

  • 它还说'business_id'列重叠,它不应该重叠,因为那是我正在创建连接的列吗?我该如何解决这个问题?
  • 嘿@DanAllan 我尝试了 join 方法,但我得到的只是 restaurant_ids_dataframe 中的 4503 个条目和属于 restaurant_review_frame 的列中的零个条目。你能告诉我为什么会这样吗?我已经按照您使用上述语句的建议执行了左连接,但由于某种原因,它似乎没有给我来自 restaurant_review_frame 的任何项目。我正在寻找的是创建一个数据框,其中包含两个数据框的所有列,并加入 business_id。我还删除了除 business_id 之外的额外列。
  • 如果您仍有兴趣解决此问题,请提供数据重现问题的示例。
【解决方案3】:

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

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

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

附:我不得不使用合并,因为 append 会不必要地填充 NaN。

【讨论】:

    猜你喜欢
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多