pandas 按索引合并两个 Dataframe

dzhpxtsq  于 2023-02-02  发布在  其他
关注(0)|答案(7)|浏览(269)

我有以下 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

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

nhaq1z21

nhaq1z211#

使用merge,默认情况下它是一个内部连接:

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

或者join,默认情况下为左连接:

df1.join(df2)

或者concat,默认情况下为外连接:

pd.concat([df1, df2], axis=1)
    • 样品**:

一个三个三个一个

to94eoyn

to94eoyn2#

您可以使用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)
7cjasjjr

7cjasjjr3#

默认情况下:
join是列向左连接
pd.merge是列内联接
pd.concat是按行外部连接
pd.concat
接受Iterable参数。因此,它不能直接接受DataFrame(使用[df,df2]
DataFrame的维度应沿轴匹配
Joinpd.merge
可以接受DataFrame参数

sr4lhrrt

sr4lhrrt4#

这个答案已经解决了一段时间,所有可用的选项都已经存在,但是在这个答案中,我将尝试对这些选项进行更多的说明,以帮助您了解何时使用什么。
这篇文章将通过以下主题:

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

基于索引的连接

TL; DR

有几个选项,根据使用情况,有些选项比其他选项简单。

  1. DataFrame.mergeleft_indexright_index(或使用命名索引的left_onright_on
  2. DataFrame.join(索引上的连接)
  3. pd.concat(索引上的连接)
    | | 优点|缺点|
    | - ------|- ------|- ------|
    | merge|·支持内/左/右/全·支持列-列、索引-列、索引-索引连接|·一次只能连接两个帧|
    | x1米11米1x|·支持内部/左(默认)/右/完整·可以一次加入多个数据框|·仅支持索引-索引连接|
    | concat|·擅长一次加入多个数据框·非常快(连接是线性时间)|·仅支持内部/完全(默认)连接·仅支持索引-索引连接|

索引到索引连接

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

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=参数来解决这个问题。由于列名相同,因此需要一个不同的后缀。
1.* * pd.concat**在索引上联接,并且可以一次联接两个或多个DataFrame。默认情况下,它执行完全外部联接。

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

有关concat的更多信息,请参阅此帖子。

列连接的索引

要使用index of left、column of right执行内部连接,您将使用DataFrame.mergeleft_index=Trueright_on=...的组合。

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

其他联接遵循类似的结构。请注意,**只有 * merge可以执行索引到列的联接。如果左侧的索引级别数等于右侧的列数,则可以在多个级别/列上进行联接。
joinconcat不能进行混合合并。您需要使用DataFrame.set_index将索引设置为预处理步骤。
这篇文章是我在Pandas Merging 101中工作的一个删节版本。请点击这个链接以获得更多关于合并的例子和其他主题。

vybvopom

vybvopom5#

一只愚蠢的虫子咬了我:联接失败,因为索引dtypes不同。这一点并不明显,因为两个表都是同一原始表的透视表。在reset_index之后,Jupyter中的索引看起来完全相同。只有在保存到Excel时才发现...
我修复了它:df1[['key']] = df1[['key']].apply(pd.to_numeric)
希望这能为某人节省一个小时!

pinkon5k

pinkon5k6#

如果您想在Pandas中连接两个 Dataframe ,您可以简单地使用mergeconcatenate等可用属性。
例如,如果我有两个 Dataframe df1df2,我可以通过以下方式将它们连接起来:

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

68bkxrlz7#

您可以尝试以下几种方法来合并/加入您的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)

相关问题