根据索引合并两个数据帧

我有以下数据框架:

> 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

在索引上合并是不好的做法吗?不可能吗?如果是这样,我如何将索引移到一个名为“索引”的新列中?

466419 次浏览

使用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)

加入通过索引连接:

 df1.join(df2)

如果你想在Pandas中连接两个数据帧,你可以简单地使用可用的属性,如mergeconcatenate

例如,如果我有两个数据框架df1df2,我可以通过以下方式连接它们:

newdataframe = merge(df1, df2, left_index=True, right_index=True)

一个愚蠢的错误让我:连接失败,因为索引dtypes不同。这并不明显,因为两个表都是同一个原始表的数据透视表。在reset_index之后,Jupyter中的索引看起来是相同的。只有在保存到Excel时才会发现……

我用:df1[['key']] = df1[['key']].apply(pd.to_numeric)修复了它

希望这能为某人节省一个小时!

在默认情况下< p >: < br > join是按列左连接
pd.merge是一个列级内连接
pd.concat是一个逐行的外部连接

< p > pd.concat: < br > 接受Iterable参数。因此,它不能直接获取数据帧(使用[df,df2])
DataFrame的尺寸应该沿着轴

匹配

Joinpd.merge:
DataFrame参数

这个答案已经解决了一段时间,所有可用的 选择已经存在了。然而,在这个回答中,我将尝试 详细介绍这些选项,以帮助您了解何时应该 使用什么。< / p >

这篇文章将讨论以下主题:

  • 在不同条件下与索引合并
    • 基于索引的连接选项:mergejoinconcat
    • 在索引上合并
    • 在一个的下标和另一个的列上合并
  • 有效地使用命名索引简化合并语法


基于索引连接

博士TL;

有一些选项,根据使用情况,有些比其他的更简单 例子。< / p >
  1. 带有left_indexright_index< >强DataFrame.merge < / >强(或使用命名索引的left_onright_on)
  2. < >强DataFrame.join < / >强(在索引上连接)
  3. < >强pd.concat < / >强(在索引上连接)
< span style=" font - family:宋体;"> < / th > < span style=" font - family:宋体;">优点< / th > < span style=" font - family:宋体;"< / th > >弊 < span style=" font - family:宋体;"> merge td > < / < span style=" font - family:宋体;">

•支持内/左/右/全连接
•支持列-列,索引-列,索引-索引连接

< span style=" font - family:宋体;">

•一次只能加入两个帧

< span style=" font - family:宋体;"> join td > < / < span style=" font - family:宋体;">

•支持内/左(默认)/右/满
•可以同时加入多个数据帧

< span style=" font - family:宋体;">

•仅支持索引-索引连接

< span style=" font - family:宋体;"> concat td > < / < span style=" font - family:宋体;">

•专门在一次连接多个数据帧
•非常快(连接是线性时间)

< span style=" font - family:宋体;">

•仅支持内/全连接(默认)
•仅支持索引-索引连接

人力资源/ > < / div > <

索引到索引连接

通常,索引上的内连接看起来像这样:

left.merge(right, left_index=True, right_index=True)

其他类型的连接(左、右、外)遵循类似的语法(并且可以使用how=...来控制)。

著名的替代品

  1. DataFrame.join默认为索引上的左外连接。

     left.join(right, how='inner',)
    

    如果你碰巧得到ValueError: columns overlap but no suffix specified,你将需要指定lsuffixrsuffix=参数来解决这个问题。由于列名相同,因此需要一个区分后缀。

  2. pd.concat在索引上连接,并且可以一次连接两个或多个dataframe。默认情况下,它执行完整的外部连接。

     pd.concat([left, right], axis=1, sort=False)
    

    有关concat的更多信息,请参见这篇文章


索引到列的连接

要使用左索引、右列来执行内部连接,您将使用DataFrame.merge (left_index=Trueright_on=...的组合)。

left.merge(right, left_index=True, right_on='key')

其他连接遵循类似的结构。注意只有 merge可以执行索引到列的连接。可以在多个级别/列上连接,前提是左侧的索引级别数量等于右侧的列数量。

joinconcat不能进行混合合并。您需要使用DataFrame.set_index将索引设置为前置步骤。


这篇文章是我工作的删节版熊猫合并101。请点击此链接获取更多关于合并的示例和其他主题。

你可以尝试以下几种方法来合并/加入你的dataframe

  1. merge(默认为内部连接)

    df = pd.merge(df1, df2, left_index=True, right_index=True)

  2. join(默认左连接)

    df = df1.join(df2)

  3. concat(默认为外部连接)

    df = pd.concat([df1, df2], axis=1)