按索引合并两个数据帧

时间:2016-11-07 14:51:51

标签: python pandas dataframe merge concat

您好我有以下数据框:

> 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

合并索引是不好的做法?这不可能吗?如果是这样,我如何将索引转换为名为“index”的新列?

由于

6 个答案:

答案 0 :(得分:187)

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

答案 1 :(得分:20)

您可以使用concat([df1, df2, ...], axis=1)来连接两个或多个由索引对齐的DF:

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

merge用于连接自定义字段/索引:

# 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)

答案 2 :(得分:5)

<块引用>

这个答案已经解决了一段时间,所有可用的 选项已经在那里了。但是在这个答案中,我会尝试 对这些选项有更多的了解,以帮助您了解何时该 用什么。

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

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


基于索引的连接

TL;DR

<块引用>

有几个选项,根据用途,有些比其他的更简单 案例。

  1. DataFrame.mergeleft_indexright_index(或使用命名索引的 left_onright_on
  2. DataFrame.join(连接索引)
  3. pd.concat(连接索引)
<头>
优点 缺点
merge

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

• 一次只能连接两帧

join

• 支持inner/left(默认)/right/full
• 可以一次加入多个DataFrame

• 仅支持索引索引连接

concat

• 擅长一次连接多个 DataFrame
• 非常快(连接是线性时间)

• 仅支持内部/完整(默认)连接
• 仅支持索引-索引连接


索引到索引连接

通常,索引内连接如下所示:

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 的详细信息,请参阅 this post


索引到列连接

要使用左索引、右列执行内连接,您将使用 DataFrame.mergeleft_index=Trueright_on=... 的组合。

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

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

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


这篇文章是我在 Pandas Merging 101 工作的删节版。有关合并的更多示例和其他主题,请点击此链接。

答案 3 :(得分:1)

如果要在熊猫中加入两个数据框,则可以简单地使用mergeconcatenate之类的可用属性。 例如,如果我有两个数据框df1df2,则可以通过以下方式加入它们:

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

答案 4 :(得分:1)

一个愚蠢的错误吸引了我:由于索引dtypes不同,连接失败。这不是很明显,因为两个表都是同一原始表的数据透视表。在reset_index之后,索引在jupyter中看起来相同。仅在保存为excel时才显示出来...

已修复:df1[['key']] = df1[['key']].apply(pd.to_numeric)

希望这可以节省一个小时!

答案 5 :(得分:0)

默认情况下:
    join是列式左连接
    pd.merge是按列的内部联接
    pd.concat是按行的外部联接

pd.concat:
    带有Iterable参数。因此,它不能直接采用DataFrames(使用[df,df2])
    DataFrame的尺寸应沿轴

匹配

加入并合并:
    可以接受DataFrame参数