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)