我有以下 Dataframe :
> 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
我问这个问题是因为我认为merge()
(即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
在索引上合并是不好的做法吗?是不可能的吗?如果是这样,我如何将索引移到一个名为“索引”的新列中?
7条答案
按热度按时间nhaq1z211#
使用
merge
,默认情况下它是一个内部连接:或者
join
,默认情况下为左连接:或者
concat
,默认情况下为外连接:一个三个三个一个
to94eoyn2#
您可以使用concat([df1, df2, ...], axis=1)来连接两个或多个按索引对齐的DF:
或merge,用于按自定义字段/索引连接:
或join,用于按索引连接:
7cjasjjr3#
默认情况下:
join
是列向左连接pd.merge
是列内联接pd.concat
是按行外部连接pd.concat
:接受Iterable参数。因此,它不能直接接受DataFrame(使用
[df,df2]
)DataFrame的维度应沿轴匹配
Join
和pd.merge
:可以接受DataFrame参数
sr4lhrrt4#
这个答案已经解决了一段时间,所有可用的选项都已经存在,但是在这个答案中,我将尝试对这些选项进行更多的说明,以帮助您了解何时使用什么。
这篇文章将通过以下主题:
基于索引的连接
TL; DR
有几个选项,根据使用情况,有些选项比其他选项简单。
DataFrame.merge
与left_index
和right_index
(或使用命名索引的left_on
和right_on
)DataFrame.join
(索引上的连接)pd.concat
(索引上的连接)| | 优点|缺点|
| - ------|- ------|- ------|
|
merge
|·支持内/左/右/全·支持列-列、索引-列、索引-索引连接|·一次只能连接两个帧|| x1米11米1x|·支持内部/左(默认)/右/完整·可以一次加入多个数据框|·仅支持索引-索引连接|
|
concat
|·擅长一次加入多个数据框·非常快(连接是线性时间)|·仅支持内部/完全(默认)连接·仅支持索引-索引连接|索引到索引连接
通常,索引上的内部连接如下所示:
其他类型的连接(左、右、外)遵循类似的语法(并且可以使用
how=...
进行控制)。1.* *
DataFrame.join
**默认为索引上的左外连接。如果您碰巧得到
ValueError: columns overlap but no suffix specified
,您需要指定lsuffix
和rsuffix=
参数来解决这个问题。由于列名相同,因此需要一个不同的后缀。1.* *
pd.concat
**在索引上联接,并且可以一次联接两个或多个DataFrame。默认情况下,它执行完全外部联接。有关
concat
的更多信息,请参阅此帖子。列连接的索引
要使用index of left、column of right执行内部连接,您将使用
DataFrame.merge
left_index=True
和right_on=...
的组合。其他联接遵循类似的结构。请注意,**只有 *
merge
可以执行索引到列的联接。如果左侧的索引级别数等于右侧的列数,则可以在多个级别/列上进行联接。join
和concat
不能进行混合合并。您需要使用DataFrame.set_index
将索引设置为预处理步骤。这篇文章是我在Pandas Merging 101中工作的一个删节版本。请点击这个链接以获得更多关于合并的例子和其他主题。
vybvopom5#
一只愚蠢的虫子咬了我:联接失败,因为索引
dtypes
不同。这一点并不明显,因为两个表都是同一原始表的透视表。在reset_index
之后,Jupyter中的索引看起来完全相同。只有在保存到Excel时才发现...我修复了它:
df1[['key']] = df1[['key']].apply(pd.to_numeric)
希望这能为某人节省一个小时!
pinkon5k6#
如果您想在Pandas中连接两个 Dataframe ,您可以简单地使用
merge
或concatenate
等可用属性。例如,如果我有两个 Dataframe
df1
和df2
,我可以通过以下方式将它们连接起来:68bkxrlz7#
您可以尝试以下几种方法来合并/加入您的
dataframe
。merge
(缺省情况下为内部连接)df = pd.merge(df1, df2, left_index=True, right_index=True)
join
(默认为左连接)df = df1.join(df2)
concat
(缺省为外连接)df = pd.concat([df1, df2], axis=1)