Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用合并时如何保持索引_Python_Pandas - Fatal编程技术网

Python 使用合并时如何保持索引

Python 使用合并时如何保持索引,python,pandas,Python,Pandas,我想合并两个数据帧,并保留第一帧的索引作为合并数据集上的索引。但是,当我进行合并时,生成的数据帧具有整数索引。如何指定要保留左侧数据帧的索引 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:

我想合并两个
数据帧
,并保留第一帧的索引作为合并数据集上的索引。但是,当我进行合并时,生成的数据帧具有整数索引。如何指定要保留左侧数据帧的索引

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')
编辑:切换到易于复制的示例代码

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

请注意,对于某些左合并操作,当
a
b
之间存在多个匹配项时,可能会得到比
a
中更多的行。在这种情况下,您可能需要。

有一个使用and的非pd.merge解决方案

这不会为索引引入虚拟的
索引
名称

但是请注意,没有
DataFrame.map
方法,因此这种方法不适用于多列

df1 = df1.merge(df2, how="inner", left_index=True, right_index=True)

这允许保留df1的索引

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

a['copy_index'] = a.index
a.merge(b, how='left')
我发现这个简单的方法在处理大型数据帧和使用
pd.merge\u asof()
(或
dd.merge\u asof()
)时非常有用


当重置索引很昂贵(大数据帧)时,这种方法会更好

我想我想出了一个不同的解决方案。我在索引值上连接左表,在基于左表索引的列值上连接右表。我所做的是正常的合并:

First10ReviewsJoined = pd.merge(First10Reviews, df, left_index=True, right_on='Line Number')
然后,我从合并表中检索了新的索引号,并将它们放在一个名为“情感线号”的新列中:

First10ReviewsJoined['Sentiment Line Number']= First10ReviewsJoined.index.tolist()
然后,我手动将索引设置回原始的左表索引,该索引基于名为Line Number的预先存在的列(我从左表索引加入的列值):

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

First10ReviewsJoined.index.name = None

也许有点像黑客,但似乎工作得很好,而且相对简单。另外,我想这可以降低重复/弄乱数据的风险。希望这一切都有意义。

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

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

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

非常巧妙。a、 合并(b,how=“left”)。set_index(a.index)也可以工作,但它似乎不那么健壮(因为它的第一部分在重置索引值之前将其丢失给a)。对于这种特殊情况,它们是等效的。但是对于许多合并操作,结果帧的行数与原始
a
帧的行数不同。“重置索引”将索引移动到一个常规列,并在合并后从此列设置索引。在由于合并操作而复制/删除a的行时,还需要注意。@W我想知道为什么左合并在默认情况下会重新索引。我在哪里可以学到更多?很好!为了避免显式指定索引名,我使用了
a.reset_index().merge(b,how=“left”).set_index(a.index.names)
。如果在特定列上进行合并,则不清楚要使用哪些索引(以防它们都不同)。这似乎优于公认的答案,因为它可能更适用于边缘情况,如多索引。有人能对此发表评论吗?问题,如果你需要分配多个列,这种方法会起作用吗,还是只限于一个字段?@Yuca:这可能不适用于多个列,因为当你对多个列进行子集时,你最终得到的是
pd.Dataframe
而不是
pd.Series
.map()
方法仅为
pd.Series
定义。这意味着:
a[['to\u merge\u on_1','to\u merge\u on_2']]。map(…)
不起作用。这是最好的答案。在合并过程中,您希望保留旧索引的原因有很多(可接受的答案并不保留索引,它只是重置它们)。当您尝试合并2个以上的数据帧时,它会很有帮助,等等…卓越的解决方案,因为它保留了(原始)索引名UpPosited,但要注意一点,当使用多索引时,索引将作为元组存储在一个称为[copy_index]的列中我在文档中读到的关于
merge\u asof
的内容表明,它不是使用索引进行连接,而是使用closes索引进行连接。您还必须以某种方式对数据进行排序,以便最接近的索引正确连接。这似乎可行,但当我将其与
on=list\u of\u cols]
一起使用时,它与文档相矛盾:
如果在列上连接列,数据框索引*将被忽略*
。使用索引和列是否有优先权?
First10ReviewsJoined.index.name = None
a.merge(b, how="left").set_axis(a.index)