python - Pandas 中的 join 和 merge 有什么区别?

标签 python pandas dataframe join

假设我有两个这样的 DataFrame:

left = pd.DataFrame({'key1': ['foo', 'bar'], 'lval': [1, 2]})

right = pd.DataFrame({'key2': ['foo', 'bar'], 'rval': [4, 5]})

我想合并它们,所以我尝试这样的事情:

pd.merge(left, right, left_on='key1', right_on='key2')

我很高兴

    key1    lval    key2    rval
0   foo     1       foo     4
1   bar     2       bar     5

但我正在尝试使用 join 方法,我一直认为它非常相似。

left.join(right, on=['key1', 'key2'])

我明白了:

//anaconda/lib/python2.7/site-packages/pandas/tools/merge.pyc in _validate_specification(self)
    406             if self.right_index:
    407                 if not ((len(self.left_on) == self.right.index.nlevels)):
--> 408                     raise AssertionError()
    409                 self.right_on = [None] * n
    410         elif self.right_on is not None:

AssertionError: 

我错过了什么?

最佳答案

pandas.merge() 是用于所有合并/连接行为的底层函数。

DataFrames 提供 pandas.DataFrame.merge()pandas.DataFrame.join() 方法作为访问 pandas 功能的便捷方式。合并()。例如,df1.merge(right=df2, ...) 等价于 pandas.merge(left=df1, right=df2, ...)

这些是 df.join()df.merge() 之间的主要区别:

  1. 在右表上查找:df1.join(df2) 总是通过 df2 的索引加入,但 df1.merge(df2)可以连接到 df2 的一列或多列(默认)或 df2 的索引(使用 right_index=True)。
  2. 左表查找:默认情况下,df1.join(df2)使用df1df1.merge(df2)的索引使用 df1 的列。这可以通过指定 df1.join(df2, on=key_or_keys)df1.merge(df2, left_index=True) 来覆盖。
  3. 左与内连接:df1.join(df2) 默认进行左连接(保留 df1 的所有行),但 df.merge 默认执行内连接(仅返回匹配的 df1df2 行)。

所以,通用的方法是使用 pandas.merge(df1, df2)df1.merge(df2)。但是对于一些常见情况(保留所有 df1 行并加入 df2 中的索引),您可以使用 df1.join( df2) 代替。

http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging 上的文档中有关这些问题的一些说明:

merge is a function in the pandas namespace, and it is also available as a DataFrame instance method, with the calling DataFrame being implicitly considered the left object in the join.

The related DataFrame.join method, uses merge internally for the index-on-index and index-on-column(s) joins, but joins on indexes by default rather than trying to join on common columns (the default behavior for merge). If you are joining on index, you may wish to use DataFrame.join to save yourself some typing.

...

These two function calls are completely equivalent:

left.join(right, on=key_or_keys)
pd.merge(left, right, left_on=key_or_keys, right_index=True, how='left', sort=False)

关于python - Pandas 中的 join 和 merge 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22676081/

相关文章:

python - 不支持的操作数类型 - : 'datetime.time' and 'datetime.time'

python - 在 numpy 的范围内生成随机日期

python - 保留列顺序 - Python Pandas 和列连接

c# - c# 或 python 中是否有任何开源项目可以绘制甘特图?

python - Flask 运行 request.method 默认为 'POST' 而不是 'GET'

python-3.x - 为数据框中的所有分类列提取不同的值

python - Scrapy 分页不起作用并优化了蜘蛛

pandas - 如何将数据框的行与组配对?

R数据框根据其他数据框填充缺失值

python - 在 python pandas dataframe groupby 上应用两个过滤条件