使用pandas merge时如何保持索引

时间:2012-08-15 20:10:05

标签: python pandas

我想合并两个DataFrames,并将第一帧的索引保留为合并数据集的索引。但是,当我执行合并时,生成的DataFrame具有整数索引。如何指定我想保留左数据框的索引?

In [4]: a = pd.DataFrame({'col1': {'a': 1, 'b': 2, 'c': 3}, 
                          'to_merge_on': {'a': 1, 'b': 3, 'c': 4}})

In [5]: b = pd.DataFrame({'col2': {0: 1, 1: 2, 2: 3}, 
                          'to_merge_on': {0: 1, 1: 3, 2: 5}})

In [6]: a
Out[6]:
   col1  to_merge_on
a     1            1
b     2            3
c     3            4

In [7]: b
Out[7]:
   col2  to_merge_on
0     1            1
1     2            3
2     3            5

In [8]: a.merge(b, how='left')
Out[8]:
   col1  to_merge_on  col2
0     1            1   1.0
1     2            3   2.0
2     3            4   NaN

In [9]: _.index
Out[9]: Int64Index([0, 1, 2], dtype='int64')

编辑:切换到可以轻松复制的示例代码

6 个答案:

答案 0 :(得分:117)

In [5]: a.reset_index().merge(b, how="left").set_index('index')
Out[5]:
       col1  to_merge_on  col2
index
a         1            1     1
b         2            3     2
c         3            4   NaN

注意:对于某些左合并操作,如果ab之间存在多个匹配项,则最终可能会有更多行,并且您需要进行重复数据删除(documentation for deduplication)。这就是为什么pandas不会保留索引的原因。

答案 1 :(得分:5)

有一个非pd.merge解决方案。使用mapset_index

In [1744]: a.assign(col2=a['to_merge_on'].map(b.set_index('to_merge_on')['col2']))
Out[1744]:
   col1  to_merge_on  col2
a     1            1   1.0
b     2            3   2.0
c     3            4   NaN

并且,并没有为索引引入虚拟index名称。

答案 2 :(得分:1)

TextView tv_test_one = findViewById(R.id.tv_test_one);
Button btn_test_one = findViewById(R.id.btn_test_one);

// This will replace button to textview
tv_test_one.setVisibility(View.VISIBLE);
btn_test_one.setVisibility(View.GONE);

//This will Replace TextView to Button
tv_test_one.setVisibility(View.GONE);
btn_test_one.setVisibility(View.VISIBLE);

这可以保留df1的索引

答案 3 :(得分:0)

您可以在左侧数据框上复制索引并进行合并。

pd.merge_asof()

我发现在处理大型数据框并使用dd.merge_asof()(或System.IO.FileLoadException: 'Could not load file or assembly 'System.Runtime, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)' )时,此简单方法非常有用。

在索引较大的数据帧设置中,将两个数据帧与索引合并非常有效,而重置索引则非常昂贵。

答案 4 :(得分:0)

认为我想出了一个不同的解决方案。我基于左表的索引将左表与索引值连接在一起,将右表与列值连接在一起。我所做的是普通合并:

First10ReviewsJoined = pd.merge(First10Reviews, df, left_index=True, right_on='Line Number')

然后我从合并表中检索了新的索引号,并将它们放在名为“情感行号”的新列中。

First10ReviewsJoined['Sentiment Line Number']= First10ReviewsJoined.index.tolist()

然后,我基于称为行号(我从左表索引加入的列值)的现有列,将索引手动设置回原始的左表索引:

First10ReviewsJoined.set_index('Line Number', inplace=True)

然后删除了“行号”的索引名称,使其保持空白:

First10ReviewsJoined.index.name = None

也许有点破绽,但似乎运作良好且相对简单。另外,猜测它会减少重复/混乱数据的风险。希望一切都有意义。

答案 5 :(得分:0)

另一个简单的选择是将索引重命名为以前的版本:

a.merge(b, how="left").set_axis(a.index)

合并会保留数据帧'a'的顺序,但只是重置索引,以便保存以使用set_axis