我有以下数据框架:
> df1
id begin conditional confidence discoveryTechnique
0 278 56 false 0.0 1
1 421 18 false 0.0 1
> df2
concept
0 A
1 B
如何对下标进行归并得到:
id begin conditional confidence discoveryTechnique concept
0 278 56 false 0.0 1 A
1 421 18 false 0.0 1 B
我问是因为这是我的理解,合并()即df1.merge(df2)使用列来进行匹配。事实上,这样做我得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
copy=copy, indicator=indicator)
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
copy=copy, indicator=indicator)
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
self._validate_specification()
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
raise MergeError('No common columns to perform merge on')
pandas.tools.merge.MergeError: No common columns to perform merge on
在索引上合并是不好的做法吗?不可能吗?如果是这样,我如何将索引移到一个名为“index”的新列中?
使用merge,这是一个默认的内部连接:
pd.merge(df1, df2, left_index=True, right_index=True)
或者join,默认为左连接:
df1.join(df2)
或concat,默认情况下是一个外部连接:
pd.concat([df1, df2], axis=1)
样品:
df1 = pd.DataFrame({'a':range(6),
'b':[5,3,6,9,2,4]}, index=list('abcdef'))
print (df1)
a b
a 0 5
b 1 3
c 2 6
d 3 9
e 4 2
f 5 4
df2 = pd.DataFrame({'c':range(4),
'd':[10,20,30, 40]}, index=list('abhi'))
print (df2)
c d
a 0 10
b 1 20
h 2 30
i 3 40
# Default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
a b c d
a 0 5 0 10
b 1 3 1 20
# Default left join
df4 = df1.join(df2)
print (df4)
a b c d
a 0 5 0.0 10.0
b 1 3 1.0 20.0
c 2 6 NaN NaN
d 3 9 NaN NaN
e 4 2 NaN NaN
f 5 4 NaN NaN
# Default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
a b c d
a 0.0 5.0 0.0 10.0
b 1.0 3.0 1.0 20.0
c 2.0 6.0 NaN NaN
d 3.0 9.0 NaN NaN
e 4.0 2.0 NaN NaN
f 5.0 4.0 NaN NaN
h NaN NaN 2.0 30.0
i NaN NaN 3.0 40.0
你可以使用concat([df1, df2,…],轴=1)为了连接两个或多个由索引对齐的DFs:
pd.concat([df1, df2, df3, ...], axis=1)
或者通过自定义字段/索引进行合并:
# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=['col1','col3'])
# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on='col1' right_index=True)
或join用于通过索引连接:
df1.join(df2)
这个答案已经解决了一段时间,所有可用
选择已经存在了。然而,在这个回答中,我将尝试
详细介绍这些选项,以帮助您了解何时应该
使用什么。
这篇文章将讨论以下主题:
在不同条件下与索引合并
基于索引的连接选项:merge, join, concat
在索引上合并
在一个的下标和另一个的列上合并
有效地使用命名索引简化合并语法
基于索引连接
博士TL;
有一些选择,根据使用情况,有些比其他的更简单
的情况。
DataFrame。使用left_index和right_index合并(或使用命名索引的left_on和right_on合并)
DataFrame。Join(对索引进行连接)
pd。Concat(在索引上连接)
|
PROS |
CONS |
merge |
• supports inner/left/right/full • supports column-column, index-column, index-index joins |
• can only join two frames at a time |
join |
• supports inner/left (default)/right/full • can join multiple DataFrames at a time |
• only supports index-index joins |
concat |
• specializes in joining multiple DataFrames at a time • very fast (concatenation is linear time) |
• only supports inner/full (default) joins • only supports index-index joins |
索引到索引连接
通常,索引上的内部连接是这样的:
left.merge(right, left_index=True, right_index=True)
其他类型的连接(左连接、右连接、外连接)遵循类似的语法(可以使用how=…来控制)。
著名的替代品
DataFrame.join defaults to a left outer join on the index.
left.join(right, how='inner',)
If you happen to get ValueError: columns overlap but no suffix specified, you will need to specify lsuffix and rsuffix= arguments to resolve this. Since the column names are same, a differentiating suffix is required.
pd.concat joins on the index and can join two or more DataFrames at once. It does a full outer join by default.
pd.concat([left, right], axis=1, sort=False)
For more information on concat, see this post.
索引到列的连接
要使用左索引、右列执行内部连接,您将使用DataFrame。合并left_index=True和right_on=....的组合
left.merge(right, left_index=True, right_on='key')
其他连接遵循类似的结构。注意,只有merge才能执行索引到列的连接。可以在多个级别/列上连接,前提是左侧的索引级别数量等于右侧的列数量。
Join和concat不能进行混合合并。您需要使用DataFrame.set_index将索引设置为前置步骤。
这篇文章是我在熊猫合并101中工作的删节版。请点击此链接获取更多关于合并的示例和其他主题。