假设我有两个这样的 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:
我错过了什么?
merge
将 left
的列连接到 right
的列,这是您想要的,但 join(... on=[...])
将 left
的列连接到 right
的索引键,这不是你要。有关更多详细信息,请参阅下面的答案。
on
选项指定)与 other
的索引相匹配。请记住,连接索引。而 merge() 是一种更通用的方法。
pandas.merge()
是用于所有合并/连接行为的底层函数。
DataFrame 提供 pandas.DataFrame.merge()
和 pandas.DataFrame.join()
方法作为访问 pandas.merge()
功能的便捷方式。例如,df1.merge(right=df2, ...)
等同于 pandas.merge(left=df1, right=df2, ...)
。
以下是 df.join()
和 df.merge()
之间的主要区别:
在右表上查找:df1.join(df2) 始终通过 df2 的索引连接,但 df1.merge(df2) 可以连接到 df2 的一个或多个列(默认)或 df2 的索引(right_index=True) .左表查找:默认情况下,df1.join(df2) 使用 df1 的索引,df1.merge(df2) 使用 df1 的列。这可以通过指定 df1.join(df2, on=key_or_keys) 或 df1.merge(df2, left_index=True) 来覆盖。左连接与内连接:df1.join(df2) 默认执行左连接(保留 df1 的所有行),但 df.merge 默认执行内连接(仅返回匹配的 df1 和 df2 行)。
因此,通用方法是使用 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 是 pandas 命名空间中的一个函数,它也可作为 DataFrame 实例方法使用,调用 DataFrame 被隐式视为连接中的左对象。相关的 DataFrame.join 方法在内部对 index-on-index 和 index-on-column(s) 连接使用合并,但默认情况下连接索引而不是尝试连接公共列(合并的默认行为)。如果您要加入索引,您可能希望使用 DataFrame.join 来节省一些输入。
...
这两个函数调用是完全等价的:left.join(right, on=key_or_keys) pd.merge(left, right, left_on=key_or_keys, right_index=True, how='left', sort=False)
我总是在索引上使用 join
:
import pandas as pd
left = pd.DataFrame({'key': ['foo', 'bar'], 'val': [1, 2]}).set_index('key')
right = pd.DataFrame({'key': ['foo', 'bar'], 'val': [4, 5]}).set_index('key')
left.join(right, lsuffix='_l', rsuffix='_r')
val_l val_r
key
foo 1 4
bar 2 5
在以下列上使用 merge
可以获得相同的功能:
left = pd.DataFrame({'key': ['foo', 'bar'], 'val': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'bar'], 'val': [4, 5]})
left.merge(right, on=('key'), suffixes=('_l', '_r'))
key val_l val_r
0 foo 1 4
1 bar 2 5
right
上的多索引与 on
上的长度具有相同的深度。这对我来说有点道理。我可以接受语义不同。但我想知道是否可以使用 df.join 获得相同的行为
pandas 提供了一个单一的函数 merge,作为 DataFrame 对象之间所有标准数据库连接操作的入口点:merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, 后缀=('_x', '_y'), copy=True, indicator=False)
和 :
DataFrame.join 是将两个可能具有不同索引的 DataFrame 的列组合成单个结果 DataFrame 的便捷方法。这是一个非常基本的示例:这里的数据对齐是在索引(行标签)上。使用合并以及指示它使用索引的附加参数可以实现相同的行为: result = pd.merge(left, right, left_index=True, right_index=True, how='outer')
不同之处之一是 merge
正在创建一个新索引,而 join
正在保留左侧索引。如果您错误地假设索引未使用 merge
更改,则可能会对您以后的转换产生重大影响。
例如:
import pandas as pd
df1 = pd.DataFrame({'org_index': [101, 102, 103, 104],
'date': [201801, 201801, 201802, 201802],
'val': [1, 2, 3, 4]}, index=[101, 102, 103, 104])
df1
date org_index val
101 201801 101 1
102 201801 102 2
103 201802 103 3
104 201802 104 4
-
df2 = pd.DataFrame({'date': [201801, 201802], 'dateval': ['A', 'B']}).set_index('date')
df2
dateval
date
201801 A
201802 B
-
df1.merge(df2, on='date')
date org_index val dateval
0 201801 101 1 A
1 201801 102 2 A
2 201802 103 3 B
3 201802 104 4 B
-
df1.join(df2, on='date')
date org_index val dateval
101 201801 101 1 A
102 201801 102 2 A
103 201802 103 3 B
104 201802 104 4 B
我相信 join()
只是一种方便的方法。请改用 df1.merge(df2)
,它允许您指定 left_on
和 right_on
:
In [30]: left.merge(right, left_on="key1", right_on="key2")
Out[30]:
key1 lval key2 rval
0 foo 1 foo 4
1 bar 2 bar 5
加入:默认索引(如果任何相同的列名,那么它会在默认模式下抛出错误,因为你没有定义 lsuffix 或 rsuffix))
df_1.join(df_2)
合并:默认相同的列名(如果没有相同的列名,它将在默认模式下抛出错误)
df_1.merge(df_2)
on 参数在两种情况下都有不同的含义
df_1.merge(df_2, on='column_1')
df_1.join(df_2, on='column_1') // It will throw error
df_1.join(df_2.set_index('column_1'), on='column_1')
将其类比为 SQL“Pandas 合并是外/内连接,Pandas 连接是自然连接”。因此,当您在 pandas 中使用合并时,您想指定要使用哪种 sqlish 连接,而当您使用 pandas 连接时,您确实希望有一个匹配的列标签以确保它连接
不定期副业成功案例分享
on=key_or_keys
来更改在右表中找到行的方式。然而,事实并非如此。on
参数将 left 表 (df1
) 上的查找从索引更改为列。但是,即使使用此参数,右表 (df2
) 也将通过其索引进行匹配。 (见上面的最后一个例子。)a.join(b, on=col)
会在a
和b
中使用col
,但它总是与b
中的索引相结合。奇怪。