我有以下数据框架:

> 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”的新列中?


当前回答

你可以使用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中工作的删节版。请点击此链接获取更多关于合并的示例和其他主题。

默认情况下: Join是按列的左连接 pd。Merge是按列的内部连接 pd。Concat是逐行的外部连接

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

Join和pd.merge: 可以接受DataFrame参数吗

您可以尝试以下几种方法来合并/加入您的数据框架。

合并(默认为内部连接) Df = pd。merge(df1, df2, left_index=True, right_index=True) 连接(默认为左连接) Df = df1.join(df2) Concat(默认为外部连接) Df = pd。Concat ([df1, df2],轴=1)

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

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

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

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