假设我有两个这样的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:
我错过了什么?
答案 0 :(得分:214)
pandas.merge()
是用于所有合并/加入行为的基础函数。
DataFrames提供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
默认执行内连接(仅返回匹配的{ {1}}和df1
)。因此,通用方法是使用df2
或pandas.merge(df1, df2)
。但是对于许多常见情况(保留df1.merge(df2)
的所有行并加入df1
中的索引),您可以使用df2
来保存一些输入。
http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging上的文档中有关这些问题的一些注意事项:
df1.join(df2)
是pandas命名空间中的一个函数,它也是 可以作为DataFrame实例方法使用,调用DataFrame 被隐含地视为联接中的左对象。相关的
merge
方法,在内部使用DataFrame.join
index-on-index和index-on-column(s)连接,但是连接索引 默认而不是尝试加入公共列(默认值merge
)的行为。如果您要加入索引,您可能希望 使用merge
为自己节省一些打字。
...
这两个函数调用完全等效:
DataFrame.join
答案 1 :(得分:61)
我总是在索引上使用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
答案 2 :(得分:11)
我相信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
答案 3 :(得分:7)
pandas提供单个函数merge,作为所有的入口点 DataFrame对象之间的标准数据库连接操作:
合并(左,右,如何='内部',开=无,左_on =无,右_on =无, left_index = False,right_index = False,sort = True, 后缀=(' _x',' _y'),copy = True,指示符= False)
并且:
DataFrame.join是一种组合两列的便捷方法 可能将不同索引的DataFrame转换为单个结果 数据帧。这是一个非常基本的示例:此处的数据对齐已打开 索引(行标签)。使用可以实现相同的行为 merge以及指示其使用索引的其他参数: result = pd.merge(left,right,left_index = True,right_index = True, 如何='外&#39)
答案 4 :(得分:2)
区别之一是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
答案 5 :(得分:1)
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')
答案 6 :(得分:0)
类似于SQL,“ Pandas合并是外部/内部联接,Pandas联接是自然联接”。因此,当您在熊猫中使用合并时,您想要指定要使用哪种sqlish联接,而当使用熊猫联接时,您确实想要一个匹配的列标签以确保其联接