mun*_*unk 171 python join dataframe pandas
假设我有两个这样的DataFrame:
left = pd.DataFrame({'key1': ['foo', 'bar'], 'lval': [1, 2]})
right = pd.DataFrame({'key2': ['foo', 'bar'], 'rval': [4, 5]})
Run Code Online (Sandbox Code Playgroud)
我想合并它们,所以我尝试这样的事情:
pd.merge(left, right, left_on='key1', right_on='key2')
Run Code Online (Sandbox Code Playgroud)
而且我很高兴
key1 lval key2 rval
0 foo 1 foo 4
1 bar 2 bar 5
Run Code Online (Sandbox Code Playgroud)
但是我正在尝试使用join方法,我一直认为它非常相似.
left.join(right, on=['key1', 'key2'])
Run Code Online (Sandbox Code Playgroud)
我得到了这个:
//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:
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
Mat*_*ipp 268
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(with 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方法在merge内部用于index-on-index和index-on-column(s)连接,但默认情况下连接索引而不是尝试连接公共列(默认行为merge).如果您要加入索引,您可能希望使用DataFrame.join以节省一些打字.
...
这两个函数调用完全等效:
Run Code Online (Sandbox Code Playgroud)left.join(right, on=key_or_keys) pd.merge(left, right, left_on=key_or_keys, right_index=True, how='left', sort=False)
Pau*_*l H 75
我总是使用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
Run Code Online (Sandbox Code Playgroud)
通过使用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
Run Code Online (Sandbox Code Playgroud)
Noa*_*oah 13
我相信这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
Run Code Online (Sandbox Code Playgroud)
pandas提供单个函数merge,作为DataFrame对象之间所有标准数据库连接操作的入口点:
合并(left,right,how ='inner',on = None,left_on = None,right_on = None,left_index = False,right_index = False,sort = True,suffixes =('_ x','_ y'),copy =是的,指标=假)
而且:
DataFrame.join是一种方便的方法,用于将两个可能不同索引的DataFrame的列组合到单个结果DataFrame中.这是一个非常基本的示例:此处的数据对齐位于索引(行标签)上.使用merge和其他参数指示它使用索引可以实现相同的行为: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
Run Code Online (Sandbox Code Playgroud)
--
df2 = pd.DataFrame({'date': [201801, 201802], 'dateval': ['A', 'B']}).set_index('date')
df2
dateval
date
201801 A
201802 B
Run Code Online (Sandbox Code Playgroud)
--
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
Run Code Online (Sandbox Code Playgroud)
--
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
Run Code Online (Sandbox Code Playgroud)
小智 5
df_1.join(df_2)
Run Code Online (Sandbox Code Playgroud)
df_1.merge(df_2)
Run Code Online (Sandbox Code Playgroud)
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')
Run Code Online (Sandbox Code Playgroud)
小智 5
与 SQL 类似,“Pandas 合并是外部/内部连接,Pandas 连接是自然连接”。因此,当您在 Pandas 中使用合并时,您想指定要使用哪种 sqlish 连接,而当您使用 Pandas 连接时,您确实希望有一个匹配的列标签以确保它连接
| 归档时间: |
|
| 查看次数: |
101458 次 |
| 最近记录: |